2009-09-20 126 views
24

可能的/部分重複:爲Web請求實現速率限制算法的最佳方式是什麼?

我找實現移動時間窗口限速算法的web應用程序,以減少的最佳方式垃圾郵件或蠻力攻擊。

使用示例爲「過去5分鐘內來自給定IP的失敗登錄嘗試的最大次數」,「最近N分鐘內的最大數量(帖子/投票數量等)」。

我寧願使用移動時間窗算法,而不是每X分鐘重新統計硬盤(如twitter api)。

這將是一個C#/ ASP.Net應用程序。

+0

我不認爲任何提供的dupe真的用asp.net/c# slant來回答這個問題。 – spender 2009-09-20 04:00:31

+0

@spender:因此那個單詞「possible」;-) – Argalatyr 2009-09-20 16:22:12

+0

確實針對「close」選民而不是原始問題內容。 – spender 2009-09-20 20:58:34

回答

10

使用基於內存的快速哈希表,如memcached。密鑰將成爲您限制的目標(例如IP),每個存儲值的到期時間應該是最長限制時間。

爲每個鍵存儲的值將包含他們在執行操作時所做的最後N次嘗試的序列化列表,以及每次嘗試的時間。

+2

因此,對於每次嘗試,我都會反序列化緩存列表,刪除時間窗口外的條目,添加新條目,計算項目並更新緩存? – Lamar 2009-09-20 03:43:55

+0

@Lamar您可以使用Redis而不是Memcached。 Redis已經建立了對列表的支持,並獲得第一和得到最後 - 我認爲,使用Redis你不需要反序列化整個列表。谷歌的「redis速率限制」 – KajMagnus 2015-02-02 20:49:20

+0

@KajMagnus Redis絕對是這個正確的解決方案。支持列表並將它應用於限速工作,非常好地結合在一起。 – Lamar 2015-03-10 20:14:48

23

我們發現Token Bucket是更好的算法,用於這種速率限制。它廣泛用於路由器/交換機,所以我們的操作人員更加熟悉這個概念。

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() 
}); 
相關問題