[PHP] メールフォームのCSRF対策

メールフォームのセキュリティについて、CSRF対策に関する覚え書き。

CSRF (Cross Site Request Forgeries) とは

超簡単に言うと「自サイトのフォームを他サイトからキックされる」こと。これを許すと悪用されるリスクが高まる。CSRFの詳細については以下サイトなど参照。

IPA ISEC セキュア・プログラミング講座:Webアプリケーション編 第4章 セッション対策:リクエスト強要(CSRF)対策
https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/301.html

CSRF対策

CSRF対策の基本は、「サーバーがフォームのサブミットを受信したとき、それが自分が生成したフォームからのモノであるかどうかを確認する」こと。具体的には、自分がフォームを生成するときにはトークンを埋め込んでおき、フォームを受信したときにそのトークンが存在するかどうかを確かめればよい。

トークンにはセッションIDが使われることがある。

メールフォームのセッションID(トークン)によるセキュリティ | メサイア・ワークス
http://www.messiahworks.com/archives/2559

しかし、セッションIDの安全性が担保できないという議論もある。

CSRF の安全なトークンの作成方法 | Webセキュリティの小部屋
http://www.websec-room.com/2013/03/05/431

CSRF の安全なトークンの作成方法(PHP編) | Webセキュリティの小部屋
http://www.websec-room.com/2013/03/05/443

擬似乱数によるトークンを使ったサンプルは以下。

PHP – とっても簡単なCSRF対策 – Qiita
http://qiita.com/mpyw/items/8f8989f8575159ce95fc

以下ページにもトークンの安全性に関するコメントがある。

PHPでクロスサイトリクエストフォージェリ(CSRF)対策するときのメモ – Qiita
http://qiita.com/yoh-nak/items/c264d29eb25f4df7f19e