章: 第5章: Web・DB・セキュリティ
ユーザーが「クリックしていないのに」フォームが送信される—— これがCSRF攻撃です。あなたのサイトは大丈夫ですか?
問題と解決策
CSRF(Cross-Site Request Forgery)は、悪意のあるサイトからユーザーのブラウザを使って本物のサイトにリクエストを送らせる攻撃です。ユーザーがログイン中であれば、Cookieが自動送信されるため、サーバーは正規のリクエストと判断してしまいます。
解決策はトークン検証です。フォームにセッション由来のランダムトークンを埋め込み、送信時にサーバー側で一致確認することで、外部サイトからの偽リクエストを弾けます。
CSRF対策手段の比較
| 手段 | 概要 | 効果 |
| なし | 対策なし | ❌ 脆弱 |
| SameSite Cookie | Cookieのクロスサイト送信を制限 | △ 補助的な対策 |
| CSRFトークン | フォームにトークンを埋め込み検証 | ✅ 基本対策 |
| DoubleSubmit Cookie | Cookieとフォーム値を照合 | ✅ SPAに有効 |
チェックポイント: トークンを生成するときに
random_bytes()やbin2hex(random_bytes(32))を使っていますか?rand()やuniqid()では予測可能なため、攻撃に弱くなります。
コードサンプル
<?php
$_SESSION['token'] = bin2hex(random_bytes(16));
// フォーム送信時に一致確認
まとめ & 次のステップ
- フォームには必ずCSRFトークンを埋め込み、送信時にセッション値と照合します
- トークン生成には
bin2hex(random_bytes(32))などの暗号的に安全な関数を使います SameSite=StrictのCookie属性も補助的な対策として有効です- GETリクエストで状態変更(削除・更新など)を行うことは避けましょう
次回は JSON処理 — API連携で必須のデータ変換スキルを学びます。