CSRF(クロスサイトリクエストフォージェリ)対策

CSRF(クロスサイトリクエストフォージェリ:Cross-Site Request Forgery)は、ユーザーが意図しない操作を第三者のサイトから強制される攻撃手法です。たとえば、ユーザーがログイン中のWebアプリケーションに対して、悪意あるサイトからリクエストを送信させることで、不正に情報を更新したり、データを削除したりすることが可能になります。

1. CSRFの仕組み

CSRFは、被害者が認証済みの状態であることを悪用します。攻撃者は、ユーザーのブラウザに対して次のようなリクエストを送信させます:

html
<img src="https://example.com/delete_account.php?id=123">

ユーザーが example.com にログインしており、セッションが有効な場合、このリクエストが自動的に実行され、意図せずアカウントが削除されてしまいます。


2. PHPにおけるCSRF対策

CSRFを防止するためには、サーバー側で「正当なリクエストであるか」を確認する仕組みを実装する必要があります。主な対策として、CSRFトークンの利用があります。

(1)CSRFトークンの生成と埋め込み

サーバー側でセッションにCSRFトークンを生成・保存し、HTMLフォームに隠しフィールドとして埋め込みます。

php
// セッションを開始 session_start(); // トークン生成(初回のみ) if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); }
html
<form method="post" action="submit.php"> <input type="hidden" name="csrf_token" value="<?php echo htmlspecialchars($_SESSION['csrf_token'], ENT_QUOTES, 'UTF-8'); ?>"> <!-- 他のフォームフィールド --> <input type="submit" value="送信"> </form>

(2)トークンの検証

フォームが送信されたときに、POSTデータに含まれるトークンとセッション内のトークンを照合します。

php
session_start(); if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) { die('不正なリクエストです。'); } // 正当なリクエスト → 本来の処理を実行 }

3. CSRF対策の補足ポイント

  • トークンはページごとに生成することが望ましい(ワンタイムトークンによる強化)。

  • JavaScriptによる非同期通信(AJAX)でも、ヘッダーにトークンを含めて送信する。

  • セッションハイジャック対策(例:セッション固定攻撃防止)と併せて対策を行うことが重要。


4. PHPフレームワークでの対応

多くのPHPフレームワーク(Laravel, Symfony, CodeIgniterなど)は、CSRF対策機能を標準で提供しており、フォームに自動でトークンを埋め込む機能が用意されています。


まとめ

CSRFは、ユーザーの信頼を利用した非常に危険な攻撃です。PHPでWebアプリケーションを開発する際には、CSRFトークンの生成・検証による対策を必ず導入することが、セキュアなシステム構築において不可欠です。

生成日:2025/05/03