フォームの繰り返し送信を防ぐ主な方法は 2 つあります:
1) リダイレクト経由 (非 Ajax フォーム送信)
2) セッション トークン経由 (セッション トークン)
クライアントがページをリクエストすると、サーバーは乱数を作成し、その乱数をセッションに配置し、その乱数をクライアントに送信します。クライアントが初めて送信する場合は、乱数がサーバーに送信され、サーバーがその乱数を受信します。サーバーに保存されている乱数を比較します。このとき、サーバーはそれを最初の送信とみなし、サーバー側で乱数を更新します。この時点で再度送信されると、クライアントは乱数をサーバーに送信しますが、乱数は以前と同じですが、サーバー側の乱数が異なる場合、サーバーはこれを次のようにみなします。繰り返し提出されることになります。
乱数を生成し、md5で暗号化します:
$_token = md5(microtime()+rand(1,10000)); $_SESSION['_token'] = $_token;
値をクライアントに送信し、フォームの隠しフィールドとして送信します:
<input type="hidden" value="<?php echo $_token;?>" name="_token"/>
次に、送信時に送信されたデータをサーバーセッションのデータと比較します。空であるか等しくない場合、不正な操作とみなされます:
if(!isset($_POST('_token'))){ echo json_encode(array('status'=>'failed','msg'=>'非法操作!')); exit(); } if(isset($_POST['_token']) && $_POST['_token']!=$_SESSION['_token']){ echo json_encode(array('status'=>'failed','msg'=>'表单只能提交一次,不能重复提交!')); exit(); }