重複の可能性/部分的:
スパムやブルートフォース攻撃を減らすために、Webアプリケーションに移動時間ウィンドウのレート制限アルゴリズムを実装するための最良の方法を探しています。
使用例は、「過去5分間に特定のIPから失敗したログイン試行の最大数」、「過去N分間の(投稿/投票など...)の最大数」です。
X分ごとに統計をハードリセットするのではなく(Twitter APIのように)、移動時間ウィンドウアルゴリズムを使用したいと思います。
これは、C#/ ASP.Netアプリの場合です。
memcached のような高速なメモリベースのハッシュテーブルを使用します。キーは制限するターゲット(IPなど)になり、保存されている各値の有効期限は最大制限時間になります。
各キーに格納されている値には、アクションの実行時に行われた最後のN回の試行のシリアル化されたリストと、各試行の時間が含まれます。
Token Bucket がこの種のレート制限に適したアルゴリズムであることがわかりました。これはルーター/スイッチで広く使用されているため、運用担当者はこの概念に精通しています。
この問題にもっと「現代的な」答えを追加するだけです。NETWebAPIの場合、 WebApiThrottle は優れており、おそらく箱から出して必要なすべてを実行します。
また、 NuGetで利用可能 です。
実装には1分ほどかかり、高度にカスタマイズ可能です。
config.MessageHandlers.Add(new ThrottlingHandler()
{
Policy = new ThrottlePolicy(perSecond: 1, perMinute: 30, perHour: 500, perDay:2000)
{
IpThrottling = true,
ClientThrottling = true,
EndpointThrottling = true
},
Repository = new CacheRepository()
});
このページは興味深い読み物だと思います。
http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx
注意すべきセクションは次のように始まります。
サービス拒否(DOS)攻撃の防止
就学前のハッカーでさえ、高価な作業を行うWebサービスを繰り返し呼び出すことでサーバーをダウンさせる可能性があるため、Webサービスはハッカーにとって最も魅力的なターゲットです。
編集:ここで同様の質問:
質問への回答を追加しました APIレート制限を超えた場合、APIリクエストを5分間ブロックします。HttpRuntime.Cache
を使用して、1分あたり60リクエストのみを許可しました。制限を超えると、次の5分間APIがブロックされます。