21

Web でよくある問題は、ユーザーがフォームの送信ボタンを複数回クリックして、サーバーがフォームを複数回処理することです。これは、ユーザーがフォームを送信した後に戻るボタンを押して、再度処理された場合にも発生する可能性があります。

ASP.NET MVC でこれが起こらないようにする最善の方法は何ですか?

私が見ている可能性は次のとおりです。

  1. 送信後にボタンを無効にします - これは複数のクリックを回避しますが、ナビゲーションは回避しません
  2. 受信アクションがすぐにリダイレクトされるようにします - ブラウザはこれらのリダイレクトを履歴から除外しているようです
  3. セッションとフォームに一意のトークンを配置します - それらが一致する場合はフォームを処理します - そうでない場合は、フォームをクリアして新しい送信を行います

もっとありますか?

これらのいずれかの特定の実装はありますか?

3 番目のオプションは、偽造防止と同様の方法で、HtmlHelper 拡張機能を備えた ActionFilter として実装されていることがわかります。

MVC 関係者の皆様からのご連絡をお待ちしております。

4

6 に答える 6

18

多くの場合、これを処理するための最も一般的な方法であるノンス キーを使用する方法を見落としがちです。

他の人が言及したようにPRGを使用できますが、PRG の欠点は、ダブルクリックの問題が解決されないこと、リダイレクトのためにサーバーへの余分な旅行が必要なこと、および最後のステップが GET 要求であるためです。投稿されたばかりのデータに直接アクセスすることはできません (ただし、クエリ パラメータとして渡すか、サーバー側で維持することはできます)。

ほとんどの場合に機能するため、Javascript ソリューションが気に入っています。

ただし、ノンス キーは常に機能します。nonce キーは、サーバーによって生成され (データベースにも保存されます)、フォームに埋め込まれたランダムな一意の GUID です。ユーザーがフォームを POST すると、ノンス キーもポストされます。POST がサーバーに着信するとすぐに、サーバーは nonce キーがデータベースに存在することを確認します。存在する場合、サーバーはデータベースからキーを削除し、フォームを処理します。したがって、ユーザーが 2 回 POST を実行すると、最初の POST の処理後に nonce キーが削除されたため、2 回目の POST は処理されません。

nonce キーには、リプレイ アタックを防止することでセキュリティを強化するという利点があります (仲介者が HTTP リクエストを傍受し、それを正当なものとして扱うサーバーにリプレイします)。

于 2009-05-20T19:20:43.563 に答える
5

POSTへのHTTP応答として常にリダイレクトを返す必要があります。これにより、ユーザーがブラウザの[進む] / [戻る]ボタンを使用して前後に移動したときに、POSTが再度発生するのを防ぐことができます。

ユーザーが送信ボタンをダブルクリックすることを心配している場合は、送信時に小さなスクリプトですぐに無効にしてください。

于 2009-05-20T16:46:49.147 に答える
2

Post-Redirect-Get(PRG)パターンを確認することをお勧めします。

于 2009-05-20T16:48:55.710 に答える
1

これは実際にはMVC固有ではありませんが、Webページで従うパターンは、アクションがフルページのPOSTではなくAJAX呼び出しで実行されるというものです。したがって、URLに移動してもアクションは実行されず、フォームが表示されるだけです。AJAX呼び出しは履歴に含まれません

于 2009-05-20T16:35:02.290 に答える
0

ボタンを無効にするとともに、クリックしても何も起こらないように、Webページ全体に透明なdivを追加できます。私たちは私の仕事でこれを行い、処理要求を示す少しフレンドリーなラベルを追加します。

于 2009-05-20T16:44:38.903 に答える
0

私が見つけた最も洗練された解決策は、ActionFilters を使用することでした。

ブログ記事はこちら

于 2013-07-24T04:40:19.047 に答える