緊急PHP2Shell(CVE-2026-109618 / 109619)公表から1日/PHP 8.1 以前は修正版なし今すぐ診断
  1. ホーム
  2. ブログ
  3. PHP のセキュリティ

PHP の CSRF 対策|トークンの作り方と確かめ方

公開
著者
編集部

PHP で作ったフォームの CSRF(クロスサイトリクエストフォージェリ)対策。トークンの作り方・確かめ方と、Cookie の SameSite をまとめた。

CSRF は、ログインしている人に、本人が意図しない操作(送信・削除・変更)をさせる攻撃。PHP で作ったフォームでの対策の基本をまとめた。

この記事の要点
  • 大事な操作のフォームには、推測できないトークンを入れる
  • トークンは random_bytes() で作り、セッションに保存する
  • 送られてきたトークンは hash_equals() で比べる
  • セッションの Cookie に SameSite=Lax 以上を付ける

トークンの流れ

  1. フォームを出すときに、bin2hex(random_bytes(32)) でトークンを作り、セッションに入れる
  2. フォームの隠し項目に、同じトークンを入れる
  3. 送信を受けたら、送られてきたトークンとセッションのトークンを hash_equals() で比べる
  4. 違えば処理しない

間違えやすい所

よくある間違い正しくは
rand() や uniqid() でトークンを作るrandom_bytes() を使う
== で比べるhash_equals() で比べる
GET で削除や変更をする状態を変える操作は POST にする
ログインのフォームには付けないログインのフォームにも付ける
  • セッションの Cookie に SameSite=Lax(または Strict)を付ける
  • Secure(https のときだけ送る)と HttpOnly も付ける
  • php.ini の session.cookie_samesite・session.cookie_secure・session.cookie_httponly で設定できる
フレームワークの仕組みを使う

Laravel などのフレームワークには、CSRF 対策の仕組みが入っている。自作する前に、フレームワークの機能を使う。

よくある質問

トークンは毎回変えたほうがいいですか?

セッションごとに1つでも効果があります。
大事な操作だけ、操作ごとに変えるとより安全です。

SameSite を付ければ、トークンは要りませんか?

トークンも付けてください。
SameSite は守りを重ねるもので、古いブラウザなどでは効かないことがあります。

無料ツールPHP2Shell 脆弱性チェッカーPHP のバージョンとサーバー会社を選ぶだけで、危険度と今やることが分かります。

参考にした情報

この記事の情報

2026年10月22日時点の公開情報にもとづく。最新は各公式のページを確認すること。

URL を入れるだけで、PHP2Shell の危険度と今やることが分かる。移行の相談もできる。

無料で診断する

この記事の著者

編集部