Web リクエストのレート制限アルゴリズムを実装する最善の方法は何ですか?
-
11-09-2019 - |
質問
可能性のある/部分的な重複:
スパム攻撃やブルート フォース攻撃を軽減するために、Web アプリケーションに移動時間ウィンドウ レート制限アルゴリズムを実装する最良の方法を探しています。
使用例としては、「過去 5 分間に特定の IP から失敗したログイン試行の最大数」、「過去 N 分間の (投稿/投票/etc...) の最大数」などがあります。
私は、X 分ごとに統計をハードリセットする (twitter API のように) よりも、移動時間ウィンドウ アルゴリズムを使用することを好みます。
これは C#/ASP.Net アプリ用です。
解決
memcachedののような高速メモリベースのハッシュテーブルを使用してください。キーが最大制限時間であるべきであるあなたが制限されている対象(例えば、IP)と各格納された値の満了となります。
各キーに格納された値は、それらが各試行のために時間と共に、アクションを実行で行われ、最後のN試行のシリアライズリストが含まれます。
他のヒント
私たちは、律速のこの種のためのより良いアルゴリズムであるのトークンバケットをました。私たちの操作の人々がコンセプトに精通しているので、それは広くルータ/スイッチに使われています。
ただ、この問題へのより「現代的な」答えを追加するには、次の.NET WebAPIの、 WebApiThrottle のです優れた、おそらく箱から出して、あなたが望むすべてを行います。
これは、NuGet の上でも、利用可能です。
実装は分程度を要し、それは高度にカスタマイズ可能です。
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サービスは、ハッカーのための最も魅力的なターゲットです。
編集:ここに同様の質問:
私はちょうど質問<のhref = "https://stackoverflow.com/questions/42411498/block-api-requests-for-5-mins-if-api-rate-limit-exceeds-に答えを追加しましたAPIのレート制限を超えた場合> 5分間ブロックAPIリクエストを「-webapithrottle-Cを使用しました。 の
私は毎分のみ60の要求を許可するようにHttpRuntime.Cache
を使用しました。制限値を超えると、次の5分間のAPIをブロックします。