PHPでCSRF対策(ワンタイムチケットの発行)
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の値は削除する事。
間違ってたら誰か指摘してくださいね。
ディスカッション
コメント一覧
まだ、コメントがありません