CSRFとは?勝手なリクエストを送らせる仕組みを簡単解説

まずは、これだけ

CSRFは、ログイン中の利用者のブラウザに、本人が意図しないリクエストを送らせる攻撃。
利用者が本物のサービスにログインしている状態を悪用します。

別サイトがログイン中の利用者のブラウザに勝手なリクエストを送らせる流れ
別サイト:勝手に送らせる 本物のサービス:ログイン中に見える

CSRFの基本

CSRFは「Cross Site Request Forgery」の略です。日本語では「リクエストの偽造」と説明されることがあります。

ポイントは、攻撃者が直接ログインするのではなく、ログイン中の利用者のブラウザを使うことです。ブラウザにはログイン用のCookieがあるため、サービス側から見ると「本人から来たリクエスト」に見えてしまう場合があります。

利用者はログイン中

本物のサービスにログインしていて、ブラウザにCookieがある。

別サイトを開く

悪意あるページが、裏で本物のサービス宛ての依頼を作る。

勝手に送られる

ブラウザがCookie付きでリクエストを送ってしまう。

起きると困る操作

CSRFで特に危ないのは、データを見るだけではなく、状態を変える操作です。メールアドレス変更、パスワード変更、配送先変更、投稿、削除、送金のような操作が例になります。

1 ログイン 利用者が本物のサービスを使う
2 別サイト 別のページを開く
3 偽の依頼 変更や送信のリクエストが作られる
4 Cookie付き ブラウザがログイン情報を添える
5 処理 本人の操作のように見える

「リンクを踏んだだけで勝手に退会する」のような作りは危険です。大事な操作は、本人が本物の画面から送ったことをサーバー側で確認する必要があります。

基本の対策

代表的な対策はCSRFトークンです。本物のフォームだけに予測しにくい値を入れておき、送信時にサーバーで照合します。

CSRFトークンで本物のフォームから送られたリクエストか確認する流れ
CSRFトークンが合わないリクエストは、本物の画面から来たものではない可能性があるため止めます。
CSRFトークン

本物の画面だけが持つ値を送信し、サーバー側で照合する。

SameSite Cookie

別サイトからのリクエストにCookieを付けにくくする。

重要操作の再確認

送金や退会などは、パスワード再入力や確認画面を挟む。

XSSとの違い

XSSは「ページの中でスクリプトが動く」問題です。CSRFは「ログイン中のブラウザに勝手なリクエストを送らせる」問題です。

どちらも利用者のブラウザが関わりますが、狙い方が違います。XSSは画面に混ざったコード、CSRFはログイン状態を利用したリクエスト、と分けて覚えると整理しやすいです。

XSSはコードを動かす攻撃。CSRFは本人のブラウザに依頼を送らせる攻撃です。