CSRF対策 メモ(php)
参考)ドットインストール
http://dotinstall.com/lessons/bbs_php_v2/24508
http://dotinstall.com/lessons/bbs_php_v2/24509
1) フォームをポストするファイルにトークンを仕込む。
1.トークンを作る
例) $token=sha1(uniqid(mt_rand(),true))
2.サーバ上に記録。
(1) session_start() で、セッションを使えるようにして、
(2) 変数 $_SESSION['token'] にトークンをセット。
3.トークンをデータとともに送信する
formからPOSTで、データとトークンを送り出す
2) データ受取りの処理をするファイルで、
サーバ上の記録と、POSTで受け取ったトークンを比較する。
サーバ上に記録がなかったり、値が異なっている場合は、異常。
if ( empty($_SESSION['token']) || ($_SESSION['token'] != $_POST['token']) )
---------------
◆ session_start エラー
エラーメッセージがでた :
Warning: session_start() [function.session-start]: Cannot send session cookie....
session_start() は、必ず、先頭に記述すること。
http://www.phppro.jp/phpmanual/php/ref.session.html
http://www.phppro.jp/phpmanual/php/function.session-start.html
---------------
◆_CSRF対策のトークンをワンタイムにしたら意図に反して脆弱になった実装例
徳丸浩の日記 2011年01月27日
http://www.tokumaru.org/d/20110127.html
(本文より)> トークン生成は安全な乱数を用いるべきであり、安全な疑似乱数生成器がない場合は、セッションIDそのものを使う方法が妥当
(コメントより)> 時刻を種にしても安全性はたいして向上しない
---------------
◆CSRF対策の実際
2011年3月4日 23:17
http://www.phppro.jp/qa/3140
answerer:ockeghem 3月7日 09:20
・トークンの要件は、「第三者に推定されないこと」
・セッションID(session_id)は推定されない(ように対策されている)という前提をおくことができます
・トークンとして推測の困難なものを使っている場合、それに加えてハッシュ関数を通す必要はありません
---------------