PHPでCSRF対策(ワンタイムチケットの発行)

2010年6月9日

PHPサイバーテロの技法 という本からのインスパイヤネタですが。

PHPでCSRF対策をする場合は、ワンタイムチケットの発行が一番というのが個人的な結論。


$ticket = ランダムの文字列; //time()やgetmypid()やランダム文字列をどこぞかで取得
$session->ticket = $ticket; //セッションに発行したチケットを格納

$smarty->assign('ticket',$ticket); //Smartyを利用した方法。hiddenのticketに値を入れる

---------------------------
HTML側
<input type="hidden" name="ticket" value="{$ticket}" />

とでも発行して、

あとは最後の砦(完了用プログラムなど)にて、DBにINSERTやUPDATEする手前で、きちんと$ticketの値とセッション内のチケットを照合して、同じかどうかを試せばよい。


$ticket = $_POST['ticket'];
if( strcmp($ticket,$session->ticket)==0 )
{
//OK
}
else
{
//チケットNG。何らかの問題あり
}

・・・

//最後に$session->ticketの値は削除する事。

間違ってたら誰か指摘してくださいね。