CSRF攻撃とは?
CSRF(クロスサイト・リクエスト・フォージェリ) は、Webサイトに対してユーザーが意図しない操作を強制的に実行させる攻撃手法のひとつです。
「フォージェリ」(forgery)とは「偽装」の意味。
たとえば、あなたがログイン中の銀行サイトがあるとします。もしあなたが悪意あるサイトを閲覧している間に、そのサイトが密かに銀行サイトへの送金リクエストを送信すると、あなた自身の操作と見なされ、意図しない送金が成立してしまう可能性があります。
2021年のOWASP TOP10では「アクセス制御の不備」に含まれていて5位に位置しています。
https://owasp.org/Top10/ja/A01_2021-Broken_Access_Control/
CSRF攻撃の仕組み
- ユーザーが正規のサイトにログインします。
- ユーザーが悪意あるサイトを訪問します。
- 悪意あるサイトが、正規のサイトへのリクエスト(例:送金、パスワード変更)をユーザーのブラウザ経由で送信します。
- ユーザーがログイン状態にあるため、正規のサイト側ではユーザー自身のリクエストだと判断し、リクエストを実行します。
具体的な攻撃例
- SNSでログイン中に、勝手に投稿が行われる
- オンラインショップで意図しない注文がされる
- 銀行サイトで勝手に送金される
対策方法
CSRF攻撃を防ぐために、以下の方法が一般的です。
-
CSRFトークンの利用
- リクエストごとにランダムな文字列(トークン)を生成し、フォーム送信時に確認する方法です。
大抵のフレームワークで対策可能もしくはデフォルトで入っていることもあるので確認しましょう。
- リクエストごとにランダムな文字列(トークン)を生成し、フォーム送信時に確認する方法です。
-
SameSite属性付きCookieの設定
- ブラウザが第三者サイトからのリクエストを防止します。
SameSite属性は主にLaxとStrictがあります。Strictは安全性が高いですが、リンクやメールなどの外部サイトから遷移すると最初はCookieが送信されないため、場合によってはエラーになることがあります。
Noneを設定する場合は、Secure属性(HTTPS通信必須)も同時に設定する必要があります。
基本的には技術的な懸念がない限りSameSiteはLax、Secure属性もつけておくべきです。
古いブラウザや一部の環境では対応していない場合があるため、注意が必要です。
- ブラウザが第三者サイトからのリクエストを防止します。
-
Refererヘッダーの検証
- リクエスト元サイトをチェックし、信頼できるドメインからのリクエストのみ許可します。
追記
この記事はAIで添削しています。
参考