web-dev-qa-db-ja.com

Webリクエストのレート制限アルゴリズムを実装するための最良の方法は何ですか?

重複の可能性/部分的:

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

使用例は、「過去5分間に特定のIPから失敗したログイン試行の最大数」、「過去N分間の(投稿/投票など...)の最大数」です。

X分ごとに統計をハードリセットするのではなく(Twitter APIのように)、移動時間ウィンドウアルゴリズムを使用したいと思います。

これは、C#/ ASP.Netアプリの場合です。

27
Lamar

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

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

10
Fragsworth

Token Bucket がこの種のレート制限に適したアルゴリズムであることがわかりました。これはルーター/スイッチで広く使用されているため、運用担当者はこの概念に精通しています。

23
ZZ Coder

この問題にもっと「現代的な」答えを追加するだけです。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()
});
8
NickG

このページは興味深い読み物だと思います。

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

注意すべきセクションは次のように始まります。

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

就学前のハッカーでさえ、高価な作業を行うWebサービスを繰り返し呼び出すことでサーバーをダウンさせる可能性があるため、Webサービスはハッカーにとって最も魅力的なターゲットです。

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

ASP.NET MVCでリクエストスロットリングを実装する最良の方法は?

2
spender

質問への回答を追加しました APIレート制限を超えた場合、APIリクエストを5分間ブロックします。
HttpRuntime.Cacheを使用して、1分あたり60リクエストのみを許可しました。制限を超えると、次の5分間APIがブロックされます。

0
JerryGoyal