2009-09-20 10 views
24
部分/

重複の可能性:ウェブリクエストのレート制限アルゴリズムを実装する最良の方法は何ですか?

私は減らすために、Webアプリケーションのためのアルゴリズムを制限する移動時間ウィンドウ率を実施するための最良の方法を探していますスパムまたはブルートフォース攻撃。

「過去5分間の特定のIPからのログイン失敗の最大回数」、「最後のN分間の最大(投稿/投票/ etc ...)」などがあります。

x分ごとにハードリセット(twitter apiなど)ではなく、移動時間ウィンドウアルゴリズムを使用することをお勧めします。

これはC#/ ASP.Netアプリケーション用です。

+0

私は提供されたdupesのいずれも実際にasp.net/c# slantでこの質問に答えないと思います。 – spender

+0

@spender:その言葉「可能」;-) – Argalatyr

+0

元の質問内容ではなく、「近い」投票者に本当に向けられました。 – spender

答えて

10

memcachedのような高速メモリベースのハッシュテーブルを使用します。キーは制限するターゲット(たとえばIP)になり、保存された値の有効期限は最大制限時間になります。

各キーに格納された値には、アクションを実行した最後のN回の試行のリストと、試行ごとの時間が含まれます。

+2

そのため、キャッシュされたリストを逆シリアル化し、タイムウィンドウ外のエントリを切り捨て、新しいエントリを追加し、アイテムを数え、キャッシュを更新します。 – Lamar

+0

@Lamar Memcachedの代わりにRedisを使うことができます。 Redisはリストをサポートしています.Redisでは、リスト全体を逆シリアル化する必要はありません。 "redis rate limiting"のためのGoogle – KajMagnus

+0

@ KajMagnus Redisはこれに対して正しいソリューションです。リストをサポートし、それをレート制限の作業に非常によく一緒に適用します。 – Lamar

23

Token Bucketが、このようなレート制限のより良いアルゴリズムであることが判明しました。それはルータ/スイッチで広く使用されているので、私たちのオペレーションの方々はこのコンセプトをよく知っています。

2

ますこのページでは興味深い読み取りであることがわかり:

http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx

セクション次のように開始するために外を見るために:

防止サービス拒否(DoS)攻撃

Webサービスはハッカーにとって最も魅力的なターゲットです。就学前のハッカーであっても、高価な作業を行うWebサービスを繰り返し呼び出すことによって、

編集:ここに同様の質問:

Best way to implement request throttling in ASP.NET MVC?

5

ただ、この問題へのより「現代的な」答えを追加する:.NET WebAPIの、WebApiThrottleのためには優れており、おそらくのうち、あなたが望むすべてを行いボックス。

また、available on 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() 
}); 
関連する問題