クロスサイトリクエストフォージェリ(CSRF)攻撃は、認証されたユーザーのWebブラウザを悪用して、攻撃者が意図的に偽造したリクエストを送信させ、Webアプリケーションで不正な操作を行わせる攻撃方法です。
攻撃例
- パラメータ改ざん
- 攻撃者が不正な値を持つURLを作成し、ユーザにそのURLを開かせる
- 例:
https://bank.example.com/transfer?amount=1000&to=攻撃者口座
- HTMLフォームの悪用
- 攻撃者がHTMLフォームを埋め込んだ悪意のあるウェブサイトを作成する
- フォームはCSRF攻撃対象サイトへの不正なリクエストを送信する
- 自動的に送信されるため、ユーザーは気づかない
- JSONハイジャック
- JSONデータを返すエンドポイントに対してCSRF攻撃が可能
- 悪意のある
<script>
タグでリソースを読み込ませる
防御策
- CSRFTokenの使用
- サーバー側で発行した不可予測なトークンを、リクエストごとに送信
- サーバー側でトークンを検証し、不正なリクエストを防ぐ
- Refererチェック
- リクエストのRefererヘッダーを検査して、信頼できるドメインからのリクエストのみを許可
- Refererはfalseにできないため、大まかな対策にはなるがすべてのケースをカバーできない
- SameSite Cookie属性
- Cookieの
SameSite
属性を設定し、クロスサイトリクエストでCookieが送信されないようにする SameSite=Strict
はクロスサイト全てをブロックSameSite=Lax
は安全なメソッド(GET, HEAD, OPTIONS, TRACE)のみ許可
- Cookieの
- リクエストヘッダーの検証
Origin
ヘッダーやReferer
ヘッダーを検証し、信頼できるドメインからのリクエストのみを許可
- ログイン画面の分離
- ログイン画面を別サブドメインで提供し、トップページと分離
- ログイン画面が別サブドメインならクロスサイトでのCookieなどが送られない
- ログアウト時のセッションリセット
- セッションを確実に破棄し、再利用を防ぐ
- 再認証
- 重要な処理の前に再度認証を求め、ユーザーが意図した操作かを確認
これらの対策を適切に組み合わせ実装することで、CSRFリスクを大幅に低減できます。定期的な脆弱性テストと最新の脅威への対応も重要です。