数か月前に、ユーザーがEnterボタンを無期限に押すような方法でキーボードをくさびで止めたため、SharePointが大幅に停止しました。ユーザーはカスタマイズされたユーザー検索ページを表示しており、同じユーザーによる何百ものPOSTが非同期で送信されたため、サーバーが過負荷になりました。
私は大規模な組織で働いているので、これを防ぐためのよりグローバルな方法を探しています。
IIS内で、一般的なユーザーによる複数のWebフォームの送信を短期間で防ぐ方法はありますか?
ボタンをクリックした後にボタンを無効にするJavaScriptを記述できることは承知していますが、同様の可能性が存在する可能性のある他のページでこの問題が発生しないようにしたいと考えています。
更新:ソースコードを見ているように見えます。キーコード13(Enter)が押されるたびに、JavaScriptはdocument.location = urlを実行しています。繰り返しになりますが、この場所でこれを防ぐためにJSを作成できますが、この種の問題をより一般的に防ぐこともできます...できればIISレベルで。
同時リクエストの数による影響を単に回避しているだけの場合は、IIS 7、動的IP制限)のアドオンがあります(この機能はIIS8に組み込まれています)。これをログ専用モードに構成して、機能を有効にする前に影響があるかどうかを判断することができます。
http://www.iis.net/downloads/Microsoft/dynamic-ip-restrictions
複数のフォームの送信は、アプリケーションレベルで対処する必要があります。マスターページを使用して実装するのは簡単です。マスターページの次のjqueryは、すべての子コンテンツページに対してトリックを実行します。
$("form").submit(function () {
$(":submit", this).attr("disabled", "disabled");
});
採用する価値があるかもしれない別の良い習慣:投稿/リダイレクト/取得
このための1つのオプションは、 http://www.iis.net/downloads/Microsoft/dynamic-ip-restrictions のようなものを使用してレート制限することです。これは、セットの問題のあるIPをブロックするように設定できます。時間の長さ。
もちろん、このようなものを本番環境に移行する前に、通常のリクエスト/秒/ IPのベースラインを設定する必要がありますが、これにより、1人のユーザーがそのようなことを再度実行できなくなるはずです。
グローバルレベルのIISモジュールを記述し、同じユーザーからの同じ要求が特定の短時間で発生するかどうかを確認できます。次に、要求を許可するかどうかを決定できます。
class CGlobalTestFilterModule:public CGlobalModule
{
public:
GLOBAL_NOTIFICATION_STATUS
OnGlobalPreBeginRequest(IN IPreBeginRequestProvider * pProvider)
{
...
}
...
}
ここにIISモジュールを実装するための良いガイドがあります: http://www.iis.net/learn/develop/runtime-extensibility/develop-a-native-cc-module -for-iis .NETに精通している場合は、管理対象モジュールを選択できます