36

古き良き「送信ボタンを無効にする」トリックは誰もが知っていますが、サーバー側で複数の送信を処理する最良の方法は何ですか? フォームを 1 回だけ送信することが絶対に重要なアプリケーションがあります。つまり、クレジット カードを処理します。現在の状況は書きませんでしたが、簡単な修正として送信時に無効にする手法を採用しましたが、JavaScript を無効にしているせっかちなユーザーの中には、まだ 2 回請求されている人もいます。

では、これを回避する方法は何ですか?いくつか考えられます - 過去にいくつか使用しましたが、これに取り組む方法に関する「ベストプラクティス」があるかどうかを確認したいと思います. 私はPHPを使用していますが、概念にもっと興味があります。

編集:私はトークン技術を認識しており、それは私が過去に使用したものです。この質問は、私のアプローチが他の優れたプログラマーが使用するものとほぼ一致しているかどうかを確認するためのものです.

4

6 に答える 6

31

非常に効果的な方法の 1 つは、リクエストと共にトークンを送信し、使用済みトークンのリストを保持することです。トークンが有効でない場合、またはトークンが既に処理されている場合は、中止します。

トークンは、非表示のテキスト フィールドに格納された増加する整数のように単純にすることも、暗号化してセキュリティを強化することもできます。この機能は、ページの作成時にトークンを生成し、暗号化してから、トークンが生成され、処理されていないことを確認することで、より堅牢にすることができます。

于 2008-10-20T15:53:37.837 に答える
10

非表示のフォーム フィールドにランダムな一意のトークンを含めます。次に、バックエンドで、以前に送信されたかどうかを確認できます。

これは、XSS 攻撃に対する防御にも役立つため、一般的には良い考えです。

于 2008-10-20T15:55:08.097 に答える
9

また、直前の 1 分間 (またはサーバーの待機時間によっては 2 秒間) に同一のトランザクションが行われたかどうかを単純にテストすることもできます。ほとんどの人は、同じカードを使って 1 分以内に 2 冊の同じ本 (または何でも) を購入することはありません。過去 1 分間のクレジット カード支払いのキャッシュを保持し、これから行おうとしている支払いが、今行った支払いと同一 (同じカード番号、同じ金額) であるかどうかを確認すると、重複を見つけることができる可能性があります。 .

于 2008-10-20T16:11:11.233 に答える
3

これについては、クライアント側には何も依存しません。クライアントに送信ボタンを表示する前に、このトランザクションのサーバー側で一意の ID を生成しないのはなぜですか? 次に、クライアントはこのトークンを送信する必要があり、サーバー側ですべてのトークンが 1 回送信されることを確認します。

トークンは、他の人が言ったように、増分整数 (+ ユーザー名) または GUID にすることができます。

于 2008-10-20T16:05:00.450 に答える
0

私は同様の問題を抱えています。これを読んだ後、私はトークンが行くべき道かもしれないと考えています. この投稿は、実装の良い例を示しています。

于 2014-04-01T20:20:20.473 に答える
-6

ユニークなトークンを生成する必要はありません。フォームの検証に合格したら、訪問者を「クレジット カードを処理中です」などの別のページにリダイレクトするだけです。訪問者がページをリロードすると、POST 送信ではなく、リダイレクトされたページがリロードされます。

于 2011-09-07T15:03:38.750 に答える