CSRF — ログイン中を悪用して「勝手な操作」をさせる

概要 — まず全体をつかむ

CSRF(クロスサイトリクエストフォージェリ)は、ログイン中の人を利用して、本人のふりで勝手な操作をさせる攻撃です。

詳細 — 1段階ずつ追う

どう起きる?

ブラウザは、あるサイトへのリクエストに、そのサイトのCookie(ログイン状態)を自動で付けます。攻撃者はこれを悪用します。

  1. あなたが銀行サイトにログイン中
  2. 別の「罠ページ」を開く
  3. 罠ページが、こっそり銀行への「送金リクエスト」を送らせる
  4. ブラウザは銀行のCookieを自動で付けるので、銀行は本人の操作だと勘違いする
アニメーション『CSRFの流れ(ログイン中を悪用)』を開く
被害者ブラウザ正規サイト罠サイト
  • 被害者ブラウザ正規サイトにログイン中で、そのサイトのCookieを持っている利用者のブラウザ
  • 正規サイト本人がログインしているサイト。Cookieが付いていれば本人の操作と信じてしまう
  • 罠サイト攻撃者が用意したサイトやメール。被害者に勝手なリクエストを踏ませる
「▶ 再生」で通しで見るか、「次へ」で1手ずつ進めてください。
0 / 5
この部分をもっと深く(中級

CSRF の根っこは、ブラウザが対象サイトの Cookie を自動で付けるという性質です。あなたが正規サイトにログイン中なら、そのサイト宛のリクエストには(誰が発生源でも)ログイン状態の Cookie が付きます。

  1. あなたが正規サイト(例=銀行)にログイン中
  2. 攻撃者の「罠ページ」を開く
  3. 罠ページが、こっそり正規サイトへ「送金リクエスト」を送らせる
  4. ブラウザが正規サイトの Cookie を自動で付けるので、サーバは本人の操作だと勘違いする

ポイントは、攻撃者は Cookie の中身を盗む必要がないことです。送らせるだけでよい。だから盗聴対策(暗号化)では防げません。

アニメーション『CSRFの流れ(ログイン中を悪用)』を開く
被害者ブラウザ正規サイト罠サイト
  • 被害者ブラウザ正規サイトにログイン中で、そのサイトのCookieを持っている利用者のブラウザ
  • 正規サイト本人がログインしているサイト。Cookieが付いていれば本人の操作と信じてしまう
  • 罠サイト攻撃者が用意したサイトやメール。被害者に勝手なリクエストを踏ませる
「▶ 再生」で通しで見るか、「次へ」で1手ずつ進めてください。
0 / 5

登場人物メモ

  • ※1 自動送信 — ブラウザが対象サイト宛リクエストに Cookie を勝手に付ける挙動
  • ※2 安全なメソッド — GET など「取得だけで副作用を持たない」べき操作

どう防ぐ?

  1. CSRFトークン — 正規の画面に「予測できない合言葉」を埋め、送信時に照合する。罠ページはこの合言葉を知らないので弾ける
  2. SameSite Cookie — 他サイト起点のリクエストにはCookieを付けない設定
  3. 重要操作は再確認 — 送金などはパスワード再入力やMFAを挟む
この部分をもっと深く(中級

対策は「この操作は正規の画面から始まったか」を確かめることに集約されます。

  1. CSRFトークン — 推測できない値を正規フォームに埋め、送信時にサーバで照合する。罠ページはこの値を読めないので弾ける。なぜ効くか=攻撃者が用意できない情報を必須にするため
  2. SameSite Cookie — クロスサイト起点の(多くの)リクエストに Cookie を付けない設定。なりすましの前提(自動送信)を崩す(ただし既定の Lax では、リンク等のトップレベル GET 遷移には Cookie が付く。Strict や併用でさらに堅く)
  3. Origin/Referer チェック — リクエストの発生源が自サイトかをヘッダで確認する補助策
  4. 安全なメソッド設計 — 副作用のある操作を GET にしない。GET は「取得だけ」に保ち、状態変更は POST 等に限る
  5. 重要操作は再確認 — 送金などはパスワード再入力や MFA を挟む
アニメーション『SameSite Cookie の効き方』を開く
SameSite Cookie の効き方起点が同じサイトか、他サイトかで「Cookie を付けるか」を変える✓ 同一サイトからの操作(same-site)正規サイトの画面銀行のページで操作送金リクエスト🍪 Cookie 付く銀行サーバ✓ 本人の操作として成立✗ 他サイト起点のクロスサイト送信(cross-site)罠サイト(攻撃者)別ドメインのページ勝手な送金リクエスト🍪 Cookie 付かない銀行サーバ✗ なりすまし不成立ログイン状態が伝わらずサーバは他人扱いSameSite=Lax/Strict は「他サイト起点の送信に Cookie を付けない」→ CSRF の前提(ブラウザによる Cookie の自動送信)を崩す

⚠️ 気をつける

  • 認証と混同 — ログイン(認証)していても防げない。CSRFは別対策が要る
  • GETで状態変更 — 「クリックしただけ」で操作が起きる作りは危険(副作用のある操作はGETにしない)
この部分をもっと深く(中級
  • 認証と混同 — ログイン(認証)していても防げない。CSRF は別軸の対策が要る
  • GETで状態変更 — 「クリックしただけ」「画像を表示しただけ」で操作が起きる作りは危険(副作用のある操作は GET にしない)
  • トークンの置き場所ミス — URL に露出させると Referer 経由で漏れうる。フォーム値やカスタムヘッダで渡す
  • SameSite 過信 — 古いブラウザや例外的な遷移では抜ける場合があり、トークンと併用するのが基本

理解度チェック

そのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。

1. CSRFの代表的な防ぎ方は?

2. CSRFが悪用するのは?

3. 「ログイン(認証)さえしていれば、CSRFは自動的に防げる」——この説明は正しい?

4. 副作用のある操作(送金など)をGETリクエストで実装するのが危険とされる理由は?

5. SameSite Cookie が果たす役割として正しいのは?

6. 送金など重要操作でCSRF被害をさらに減らすために追加で挟むとよいのは?

7. ブラウザが対象サイトへのリクエストに自動で付けてしまう、ログイン状態を表す小さなデータを何と呼ぶか(カタカナで)。

8. 正規のフォームに埋め込む「予測できない合言葉」で、送信時に照合してCSRFを防ぐ仕組みを何と呼ぶか。