0

PHP で記述されたアプリケーションの「注文の確認」ページでは、複数のフォームの送信を防止して、重複した注文を受けないようにする必要があります。これを次の 2 つの方法で処理しようとしました。

  1. JavaScript をサポートしているユーザーの場合、送信ボタンをクリックすると無効になります
  2. フォームでトークンが生成され、セッションに保存されます。最初の送信時にそれらが比較され、セッション トークンが削除されます。したがって、一致するトークンのない後続の送信は拒否する必要があります。これには、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']);
   }

?>

セッションが開始され、トークンが正しく生成され、その後設定が解除されます。

私は過去にこのアプローチを問題なく使用しましたが、今回はまだうまくいくようです. 洞察をいただければ幸いです。

4

1 に答える 1

0

Ghigo からのコメントに従って、この作業を行うためにコードをリファクタリングしました。

この問題は、最終的には iframe とフォーム送信からのセッション ロックの問題でした。セッションができるだけ早く閉じられたことを確認することが、これを修正するための鍵でした。

于 2013-03-26T11:13:26.377 に答える