結論: CSRF(シーサーフ)は、ログイン中の利用者のブラウザを使い、本人が意図しない操作を、サイトに送らせる攻撃です。ブラウザが、同じサイトへのリクエストにCookieを自動で付ける性質を悪用し、サイトに「本人の操作」と誤認させます。対策の基本は、CSRFトークンとSameSite属性で、重要な操作には再確認を入れます。
CSRFとは
CSRFは、Cross-Site Request Forgery(クロスサイト・リクエスト・フォージェリ)の略です。日本語では、「リクエスト強要」や「なりすましのリクエスト」とも呼ばれます。
たとえば、銀行サイトにログインしたまま、別のサイトを開いた時に、裏で、銀行サイトへ「送金する」というリクエストを送られてしまうような被害です。
仕組み
- 利用者が、銀行サイトにログインしている(ブラウザに、ログインの印であるCookieが残っている)
- 利用者が、罠のページ(メールのリンクなどで誘導された別のサイト)を開く
- 罠のページが、利用者のブラウザに、「銀行サイトへ送金する」リクエストを送らせる
- ブラウザは、銀行サイトへのリクエストなので、ログイン中のCookieを自動で付けて送る
- 銀行サイトは、Cookieが正しいので、「本人の操作」と判断して、実行してしまう
利用者は、何も入力していません。画面上では、何も起きたように見えないこともあります。ログインの仕組みは、Cookieとはと、セッションとはをご覧ください。
起こりうる被害
| 被害 | 例 |
|---|---|
| お金の操作 | 送金、購入、ポイントの移動 |
| 設定の変更 | メールアドレスやパスワードの変更 |
| 投稿・操作 | SNSへの投稿、データの削除 |
| 管理操作 | 管理者がログイン中に、ユーザーの追加や権限の変更 |
特に、管理者が狙われると、被害が大きくなります。
XSSとの違い
| CSRF | XSS | |
|---|---|---|
| 何をするか | 利用者のブラウザから、サイトへ操作を送らせる | 利用者のブラウザで、不正なスクリプトを動かす |
| 必要なもの | ログイン中であること、予測できるリクエスト | サイトの出力処理の弱点 |
| スクリプト | 不要 | 必要 |
XSSの仕組みは、XSSとはで解説しています。XSSがあると、CSRFトークンも盗まれることがあるため、両方の対策が必要です。
対策
① CSRFトークン(基本)
サーバーが、フォームごとに、**推測できないランダムな値(トークン)**を発行し、フォームに埋め込みます。送信された時に、トークンが一致するかを確認します。
<form method="POST" action="/transfer">
<input type="hidden" name="csrf_token" value="ランダムな値">
<!-- 金額などの入力欄 -->
<button type="submit">送金する</button>
</form>
罠のページは、このトークンの値を知らないため、正しい値を付けて送れません。多くのフレームワークには、この仕組みが、標準で用意されています。
② SameSite属性(Cookie)
Cookieに、SameSite属性を付けると、別のサイトから送られたリクエストに、Cookieを付けるかを制御できます。
Set-Cookie: session=...; HttpOnly; Secure; SameSite=Lax
Strict:同じサイトからのリクエストにだけ、Cookieを付けるLax:通常のリンクによる移動などは許可し、別のサイトからの、フォームの送信などには付けない
ブラウザによっては、指定がなくても、Laxに近い動きをすることがありますが、ブラウザの既定の動きに頼らず、サーバー側でも、トークンなどで対策します。
③ 重要な操作の前の、再確認
送金や、パスワードの変更など、重要な操作の前に、パスワードの再入力や、確認画面を入れます。罠のページからは、これらを通過できません。
④ 状態を変える操作は、GETで受け付けない
「参照するだけ」のGETリクエストで、データを変える処理を実行しないようにします。変更は、POSTなど、トークンの確認ができる方法で受け付けます。
CORSとの関係
**CORSは、CSRFの対策ではありません。**CORSは、ブラウザが、別のサイトのスクリプトに、レスポンスの読み取りを許可するかを決める仕組みです。CSRFは、レスポンスを読めなくても、リクエストを送れれば成立します。仕組みの違いは、CORSとはで解説しています。
利用者ができる備え
サイト側の対策が基本ですが、利用者も、次の備えで、リスクを減らせます。
- 重要なサービスは、使い終わったらログアウトする
- メールやSMSの、不審なリンクを開かない
- ブラウザと、拡張機能を、最新にする
- 重要なサービスには、二段階認証を設定する(二段階認証とパスキー)
まとめ
- CSRFは、ログイン中のブラウザを使い、本人が意図しない操作を、サイトに送らせる攻撃
- ブラウザが、同じサイトへのリクエストにCookieを自動で付ける性質を悪用する
- 対策の基本は、CSRFトークンとSameSite属性。重要な操作には、再確認を入れる
- XSSとは別の攻撃。CORSは、CSRFの対策ではない