CSRF(クロスサイトリクエストフォージェリ)完全攻略|SameSite属性・トークン検証徹底解説
IPA試験(支援士・応用情報)の午後記述式問題において、XSSと対比して頻繁に出題される重要テーマが「CSRF(クロスサイトリクエストフォージェリ / Cross-Site Request Forgery)」です。
「利用者がログイン状態にあることを悪用し、外部の罠サイトから意図しない状態変更リクエストを送信させる」という手口の本質を正しく理解し、「なぜ従来のCookie認証だけでは防げないのか」「SameSite CookieやCSRFトークンがどう機能するのか」を正確に記述できることが合格への必須条件です。
1. CSRFとは? 攻撃成立のメカニズム
CSRFとは、利用者がターゲットとなるWebサイト(銀行、SNS、ECサイト等)にログイン中であることを悪用し、攻撃者が用意した罠ページを訪問させることで、利用者のブラウザから自動的にターゲットサイトへ不正なHTTPリクエスト(パスワード変更、送金、商品購入、退会等)を送信させる攻撃です。
Webブラウザは通常、クロスオリジン(異なるドメイン間)のリクエストであっても、宛先ドメインに紐づくCookie(セッションID)を自動的に付加して送信します。このため、サーバ側は「正当なログイン中ユーザーからの正規のリクエスト」と誤認して処理を実行してしまいます。
比較項目 | XSS(クロスサイトスクリプティング) | CSRF(クロスサイトリクエストフォージェリ) |
|---|---|---|
攻撃の実行場所 | ターゲットサイトのドメイン上のブラウザ環境で不正スクリプトが動作 | 攻撃者の罠サイト等からターゲットサイトへリクエストが送信される |
攻撃の目的 | 情報の窃取(Cookie盗聴、画面改ざん、情報盗み見) | 意図しない操作・状態変更の強制(送金、パスワード変更、投稿) |
必須条件 | ターゲットサイトに出力エスケープ漏れ等の脆弱性があること | 利用者がターゲットサイトにログイン状態(セッション有効)であること |
2. IPA試験で頻出の攻撃手口と出題パターン
- 自動送信フォーム(POSTリクエスト): 罠ページ内に <form method="POST" action="https://target.com/api/transfer"> を埋め込み、JSの form.submit() で自動送信させる手口。POSTメソッドにするだけではCSRFは防げない。
- 画像タグ等の埋め込み(GETリクエスト): 退会や状態変更処理がGETメソッドで実装されている場合、<img src="https://target.com/account/delete"> を置くだけで画像取得時に攻撃が成立する。状態変更にGETを使ってはならない。
- パスワード変更・メールアドレス変更の乗っ取り: 現在のパスワードを再入力させずにメールアドレスを変更できる仕様だと、CSRFで攻撃者のメールアドレスに書き換えられ、パスワード再発行機能でアカウントが完全に奪われる。
3. 防御対策の鉄則:根本的対策 vs 保険的対策
分類 | 対策手法 | 役割・効果 | 試験での位置づけ |
|---|---|---|---|
根本的対策 ① | 暗号学的に安全なワンタイムトークンの検証 (CSRFトークン) | フォーム表示時に予測困難なランダム文字列(トークン)を発行してセッションに保持し、送信されたトークンと一致するか検証する。 | 【最頻出の正解】 第三者サイトからはトークンを推測・取得できないため、偽造リクエストを確実に排除できる。 |
根本的対策 ② | Cookieへの SameSite 属性(Strict / Lax)指定 | SameSite=Strict または Lax を設定し、他サイトからのクロスサイトリクエスト時にセッションCookieの自動送信をブラウザで禁止する。 | モダンブラウザにおける最もシンプルで強力な根本対策。 |
根本的対策 ③ | 重要な操作時のパスワード再入力(再認証) | 送金やパスワード・メールアドレス変更時に、現在のパスワードを再入力させる。 | 仮にCSRFリクエストが飛んできてもパスワード値を知らないため成立しない。 |
保険的対策 ① | Referer / Origin ヘッダの検証 | リクエスト元のドメインが自サイトと一致するかをサーバ側でチェックする。 | ブラウザのプライバシー設定等でRefererが送信されない場合があるため次善策・多層防御。 |
保険的対策 ② | 処理完了通知メールの送信 | パスワードやメールアドレス変更直後に、旧メールアドレス宛てに即時通知を送る。 | 不正な変更が発生したことをユーザーが早期検知するための保険的対策。 |
4. 午後記述式試験(SC・AP)で使える得点キーワード・記述テンプレート
【定番記述フレーズ①(トークン検証の根本対策)】 「セッション毎に予測困難なトークンを生成し、リクエスト時の送信値と照合する。」(39字)
【定番記述フレーズ②(SameSite Cookie対策)】 「セッションCookieにSameSite属性を設定し、クロスサイトでの送信を制限する。」(40字)
【定番記述フレーズ③(重要処理での再認証)】 「重要な処理の実行前に、現在のパスワードを再入力させて認証を行う。」(33字)
【定番記述フレーズ④(HTTPメソッドの原則)】 「データの更新や削除を伴う処理にGETメソッドを使用しない。」(29字)