[PHP]フォームの2重送信防止をCookieで行うサンプル

2重送信防ぐ方法でセッションにワンタイムパスワードみたいなの保存しとく方法があけど、
セッション使いたくないなーと思った時は変わりにCookieに保存しとくっていう手もある。
1ページ完結のスクリプトだと特にheader()で飛ばすとエラー出る事もあるので結構便利だと思う。

1、フォームのheddenでトークンIDをセット。IDは表示されるたびに入れ替わる。

print '<input type="hidden" name="ticket" value="'.getTokenId().'" />'."\n";

2、保存とか送信とかが成功した時点でPOSTされたトークンIDをCookieに保存するようにして

$ticket = $_POST["ticket"];
setNewCookie("sample_ticket",$ticket,time()+(3600*24*30));

3、Step2の前のタイミングでPOSTをチェックして、保存されたチケットとPOSTされたチケットが同じなら弾くようにする。

if($_POST[ticket] == $_COOKIE["sample_ticket"]){
	print "不正な送信です";
}

▼サンプルソースの関数

//トークン用ID発行
function getTokenId(){
	return substr(md5(uniqid().mt_rand()),-13,10);
}
//クッキー発行
function setNewCookie($name, $value, $time){
	return setcookie($name, $value, $time);
}

セッションの場合もやり方は同じ。

1件のコメント

  1. こんにちわ。
    こちらのスクリプトを見させて頂いてるのですが、実行すると、

    Cannot break/continue 1 level

    というエラーが出ますが、
    このエラーは想定内のものでしょうか?
    回避の仕方が分からなかったので、コメントさせて頂きました。

    Reply
  2. sasaki さん>

    #3にあるcontinue;を消すかexit();などに変更すれば直ると思います。(記事は消しておきました)

    Reply

Leave a Comment.