CSRF対策の実施
#07 CSRF対策を施そう
http://dotinstall.com/lessons/poll_php_v2/9707
を参考に
セキュリティを高めるためにCSRF対策を施す
sha1はハッシュで、暗号化とは異なり求み戻せない
暗号化の場合は、鍵があれば元に戻せる
今回、編集するファイルは index.php
まず、投稿されたかどうか判定する
if($_SERVER[‘REQUEST_METHOD’] != ‘POST’)
!= ‘POST’はPOSTではない
つまり投稿されていない状態という意味
else のほうに、投稿されたときの処理を書く
投稿前の処理で、CSRF対策をしておく
CSRF対策は、トークンをフォームにセットして
投稿された後に、このフォームから投稿されたものか
値をチェックすることで判定する
これは、偽者のフォームなど、悪意あるフォームからの投稿を防ぐため
まず、セッションをみて
トークンがセットされていないなら、トークンをセットする
if(!isset($_SESSION[‘token’])){
とすれば判定できる
isset() は指定した値が入っているかチェックする
http://php.net/manual/ja/function.isset.php
を参考
トークンの中身は推測されにくいランダムな文字列を使う
このときに sha1() を使う
暗号化した文字列を取得するのに使う
http://phpjp.com/sha1.htm
を参考に
この中で mt_rand() という乱数を発生させる関数
これについては
乱数を生成する(rand, mt_rand)
http://www.phpbook.jp/func/math/index1.html
を参考
そして
uniqid()
これは
マイクロ秒単位の現在時刻にもとづいた、接頭辞つきの一意な ID を取得
一意というのは、他と被らないただ1つという意味
uniqid() で true が設定されていると
23文字になる
これについては
http://phpspot.net/php/man/php/function.uniqid.html
を参考
これらを元に
$_SESSION[‘token’] = sha1(uniqid(mt_rand(),true));
これでハッシュ化されたランダムな文字列を作り
token に設定している
また、セッションを使うため
require_one() の下あたりに
session_start();
を追記する
ここからセッション開始になる
また、HTMLのフォーム部分に
セッショントークンを埋め込むため
<input type=”hidden” name=”token” value=”<?php echo h($_SESSION[‘token’]); ?>”>
というように
type=”hidden” にして画面には表示されないようにして
おく
実行後、ブラウザでソースをみると、値がセットされているのがわかる