PHP で記述されたアプリケーションの「注文の確認」ページでは、複数のフォームの送信を防止して、重複した注文を受けないようにする必要があります。これを次の 2 つの方法で処理しようとしました。
- JavaScript をサポートしているユーザーの場合、送信ボタンをクリックすると無効になります
- フォームでトークンが生成され、セッションに保存されます。最初の送信時にそれらが比較され、セッション トークンが削除されます。したがって、一致するトークンのない後続の送信は拒否する必要があります。これには、CSRF 攻撃を防ぐという追加の利点があります。
どちらもかなり標準的な慣行であることは理解していますが、問題は残っているようですか? 送信ボタンを数回クリックすると、jsが無効になっているため、X回の重複注文が表示されます。
これにより、おそらく問題は構成に関連していると思います。これは lighthttpd でホストされ、php は cgi-fcgi でコンパイルされています。それが関連性があるかどうかは完全にはわかりませんが、これがどのように可能になったかについては困惑しています.
サーバー コードは次のとおりです (簡潔にするために省略しています)。
<?php
$_SESSION['token'] = uniqid('', true);
?>
<form name="myform" action="confirm" method="POST">
<!--.... -->
<input type="hidden" name="csrftoken" value="<?php echo $_SESSION['token']; ?>" />
<input type="submit" name="submit" />
次に、送信時にトークンが検証されます。
<?php
if ($_POST['csrftoken'] == $_SESSION['token']) {
//proceed and process order
unset($_SESSION['token']);
}
?>
セッションが開始され、トークンが正しく生成され、その後設定が解除されます。
私は過去にこのアプローチを問題なく使用しましたが、今回はまだうまくいくようです. 洞察をいただければ幸いです。