PHP の CSRF 対策|トークンの作り方と確かめ方
PHP で作ったフォームの CSRF(クロスサイトリクエストフォージェリ)対策。トークンの作り方・確かめ方と、Cookie の SameSite をまとめた。
CSRF は、ログインしている人に、本人が意図しない操作(送信・削除・変更)をさせる攻撃。PHP で作ったフォームでの対策の基本をまとめた。
この記事の要点
- 大事な操作のフォームには、推測できないトークンを入れる
- トークンは
random_bytes()で作り、セッションに保存する - 送られてきたトークンは
hash_equals()で比べる - セッションの Cookie に
SameSite=Lax以上を付ける
トークンの流れ
- フォームを出すときに、
bin2hex(random_bytes(32))でトークンを作り、セッションに入れる - フォームの隠し項目に、同じトークンを入れる
- 送信を受けたら、送られてきたトークンとセッションのトークンを
hash_equals()で比べる - 違えば処理しない
間違えやすい所
| よくある間違い | 正しくは |
|---|---|
rand() や uniqid() でトークンを作る | random_bytes() を使う |
== で比べる | hash_equals() で比べる |
| GET で削除や変更をする | 状態を変える操作は POST にする |
| ログインのフォームには付けない | ログインのフォームにも付ける |
Cookie の設定
- セッションの Cookie に
SameSite=Lax(またはStrict)を付ける Secure(https のときだけ送る)とHttpOnlyも付ける- php.ini の
session.cookie_samesite・session.cookie_secure・session.cookie_httponlyで設定できる
フレームワークの仕組みを使う
Laravel などのフレームワークには、CSRF 対策の仕組みが入っている。自作する前に、フレームワークの機能を使う。
よくある質問
トークンは毎回変えたほうがいいですか?
セッションごとに1つでも効果があります。
大事な操作だけ、操作ごとに変えるとより安全です。
SameSite を付ければ、トークンは要りませんか?
トークンも付けてください。
SameSite は守りを重ねるもので、古いブラウザなどでは効かないことがあります。
参考にした情報
この記事の情報
2026年10月22日時点の公開情報にもとづく。最新は各公式のページを確認すること。
URL を入れるだけで、PHP2Shell の危険度と今やることが分かる。移行の相談もできる。
無料で診断する


