ページを前後に移動したり、ページを更新したりして、フォームの重複を防ぐテクニックを思いつきました。そして、私はここでそれを打ち消すことを考えました、私は既に実稼働環境ではないサンプルをテストしました。あなたが識別できる欠陥は何ですか?重複したフォームの投稿を防止する
私は、CSRF攻撃からあなたを守るフォームトークンを使用していることをよく知っており、以下の手順では追加されませんでした。
各フォームの-generateフォームIDを、フォームに隠しフィールドとして使用:
$formid = microtime(true)*10000;
- 形態でを提出:
検証データ
- から
フォームフィールドデータのハッシュを計算する
$allvals = ''; foreach($_POST as $k=>$v){ $allvals .= $v; } $formHash = sha1($allvals);
以前に保存したハッシュと比較してフォームハッシュを検証します。セッションの値は$ formid変数によって各フォームにバインドされます。
$allowAction = true; if(isset($_SESSION['formHash'][$_POST['formid']]) && ($_SESSION['formHash'][$_POST['formid']] == $formHash)){ $allowAction = false; }
- フォームハッシュが見つからない場合、これは送信された最初のフォームまたはフォームデータが変更されたことを意味します。
データは、(例えば、データベースに)保存されている場合、セッションにフォームのハッシュを保存します。
$_SESSION['formHash'][$_POST['formid']] = $formHash;
コードのフルバージョン: http://thebusy.me/2011/01/06/preventing-duplicate-form-submissions/
ハッシュスニペットを '$ formHash = sha1(serialize($ _ POST));'に対してベンチマークすることを検討してください。それは有益かもしれないし、そうでないかもしれないキーをハッシュするでしょう。 – Dan
おそらく関連する/ dup、http://stackoverflow.com/questions/4614052/how-to-prevent-multiple-form-submission-on-multiple-clicks-in-php/4614310#4614310 – user562374
可能な重複のhttp:/ /stackoverflow.com/questions/218907/how-to-handle-multiple-submissions-server-side –