第48回: CSRF対策 — 意図しないリクエストをトークンで防ぐ

章: 第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連携で必須のデータ変換スキルを学びます。

Related Articles