クロスサイト・リクエスト・フォージェリー(CSRF)とクロスサイト・スクリプティング(XSS)を混同してしまっていたので、お互いの説明を整理しました。
🏈 いいたいこと
- CSRFは攻撃スクリプトがサーバ上で動く、XSSはブラウザ上で動く
- 結果として「なりすまし」ができる点が似ている
🐠 クロスサイト・リクエスト・フォージェリー(CSRF)
CSRF(Cross Site Request Forgeries)とは、本来拒否すべきほかのサイトからのリクエストを受けて、セキュリティを無視した攻撃を行う手法です。
攻撃の流れ
CSRFの攻撃の主な流れは次のとおりです。
- 攻撃者が攻撃用のWebページを作成してWWW上に公開する
- 第三者が攻撃用のWebページにアクセスする
- 第三者がHTTPリクエストによって、攻撃者の意図した操作が行われる
サンプルコード
次のイメージタグは実際にお金の引き出しを要求します。
<img src="http://bank.example.com/withrraw?account=john&acount=200000" /> |
事前に銀行のアカウントでログインしており、Cookieが有効な場合はHTMLを読み込むとすぐに送金されれてしまいます。
対策
Webサイト(開発者)側のCSRFへの対策は次のような方法があります。
- 暗号論的擬似乱数をCookie値とformのhidden値に発行する
- 一方の値は、偽造を防ぐために暗号学的ハッシュ関数に通す
- HTTP POST時にその両方の値が一致するかを検証する
- 入力項目のフィルタリングを行う
- Cookieの有効期限を短くする
🗻 クロスサイト・スクリプティング(XSS)
クロスサイト・スクリプティング(XSS)とはWebページに任意のスクリプトが紛れ込み、Webサイトを閲覧した第三者のブラウザで紛れ込んだスクリプトが実行されます。
🐰 攻撃の流れ
- 攻撃者が攻撃用のWebページを作成してWWW上に公開する
- 第三者が攻撃用のWebページにアクセスする
- JavaScriptが実行されて、Cookieの盗難などを行う(ページの改ざんもある)
- 盗まれたCookie値などを利用して、攻撃者が意図した操作を行う
🤔 対策
XSSの対策としては、ユーザーの入力値のチェックや出力時のサニタイズ(無害化)を行うなどがあります。