26

Web開発者が二重提出の問題をどのように回避するかを知りたいです。したがって、基本的に問題の私の理解は次のとおりです。

せっかちなユーザーがフォームを複数回送信すると、二重送信が発生し、問題が発生します。この問題は、フォームが送信されると送信ボタンを無効にするJavaScript(特にjQueryスクリプト)によって修正できます。これの弱点は、クライアントでJavaScriptが無効になっている場合です。

サーバー側の検出方法もあります。

だから私の質問は:

人々はどのようにして二重提出を克服しますか?二重提出によって引き起こされる問題の実際の例は何ですか?Webアプリケーションフレームワークには二重送信ツールが組み込まれていますか?

4

7 に答える 7

20

実際の状況: 賭けの Web サイトで賭けをする。ユーザーはダブルクリックして 2 回ベットします。良くない!Javascript チェックは、これを防ぐのに十分ではありませんでした。

解決:

  1. フォームをレンダリングするサーバー側スクリプト言語を使用して、フォームにUUID / GUID隠し入力を作成します。

  2. フォームの送信時に、すぐにこれをUniqueSubmissions(たとえば) という名前のデータベース テーブルに追加します。その後、処理を進めます。

  3. テーブルに見つかった場合、同じ UUID/GUID を持つ後続のすべての要求は拒否されUniqueSubmissionsます。

これはうまくいきました。あなたの質問に答えるのに役立つことを願っています!

于 2011-01-16T12:10:38.883 に答える
8

Java サーバーサイドスクリプトを使用していて、struts 2 も使用している場合は、 token の使用について説明しているこのリンクを参照してください。

http://www.xinotes.org/notes/note/369/

トークンを生成し、最初のページのレンダリングのためにセッションに保持する必要があります。リクエストが初めてトークンとともに送信されると、struts アクションでスレッド名をトークン ID としてスレッドを実行し、クライアントが持っているロジックを実行します。が要求された場合、クライアントが同じ要求を再度送信すると、スレッドがまだ実行されているかどうかを確認し (thread.getcurrentthread().interrupted) まだ実行されている場合は、クライアントにリダイレクト 503 を送信します。

struts 2code の ExecuteAndWaitInterceptor を見てください。トークンと組み合わせたこのロジックは、高速クリックに役立ちます

于 2011-01-15T12:40:06.110 に答える
7

リダイレクト後のポストまたはPRGと呼ばれることもある(post/redirect/get)を使用します。

つまり、ユーザーがフォームを投稿すると、(投稿データを消費した後) クライアント側のリダイレクトを実行して、応答 (成功) ページに移動します。

于 2011-01-15T12:30:41.290 に答える
5

実際の例は、この回答が2回投稿されたものです;-)。クライアント側のどの側面 (javascript、または Cookie) にも依存したくない場合は、送信元 IP や使用するブラウザーなどの情報を追加して、送信されたデータの MD5 ハッシュを計算し、投稿を拒否することができます。同じハッシュを持つもの。

于 2011-01-15T13:03:51.007 に答える
3

web2pyフレームワークには、フォームの二重送信に対する保護が組み込まれています。セッションとフォームの非表示フィールドにワンタイムトークンを保存し、送信時に一致する必要があります。一致しない場合、送信は拒否されます。この方法は、CSRF (クロスサイト リクエスト フォージェリ)からも保護します。

于 2011-02-06T02:47:55.863 に答える
2

フォームがサーバー dbms にデータを保存するためのインターフェイスを提供する意図がある場合は、送信されたデータに必須の特別なリビジョン フィールドを使用できます。送信されたリビジョンがデータベース内のデータの最新バージョン (または挿入される新しいデータのバージョン) と一致するかどうかを確認することで、複数の送信が行われた場合の対処方法を適切に制御できます。順番通りに。

于 2011-01-15T12:37:04.423 に答える
1

Struts Web アプリケーション フレームワークを使用すると、この問題を次のように処理できます。

Struts には、 に使用する 3 つのメソッドがありtoken, saveToken(), isTokenValid() and resetToken()ます。

saveToken()- トークン キーを生成し、request/session 属性に保存します。
isTokenValid()- 要求/セッションで 1 つのストアに対して送信されたトークン キーを検証します。
resetToken()- トークン キーをリセットします。

仕組み: 1) フォームをロードすると、アクション クラスを
呼び出して、トークン キーを作成および保存します。saveToken()Struts は、生成されたキーをリクエスト/セッションに保存します。トークンが正常に作成された場合、ブラウザでソースを表示すると、次のようなものが表示され、トークン キーが隠しフィールドとして保存されます。

<form action="myaction.do" method="post"> 
 <input type="hidden" 
 name="<%= Constants.TOKEN_KEY %>" 
 value="<%= session.getAttribute(Action.TRANSACTION_TOKEN_KEY) %>" > 

2) フォームが送信され、アクション クラスで呼び出さisTokenValid()れると、送信されたトークン キー (隠しフィールド) が、要求/セッションで以前に保存されたトークン キーで検証されます。一致する場合は true を返します。

public final ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
    saveToken(request);
    if (!tokenIsValid(request)) {
        //forward to error page saying "your transaction is already being processed" 
    } else {
        //process action 
        //forward to jsp 
    }
    // Reset token after transaction success. 
    resetToken(request);
}

参照

于 2015-08-13T11:37:24.183 に答える