为Web请求实施速率限制算法的最佳方法是什么?

时间:2009-09-20 03:24:03

标签: c# asp.net algorithm throttling rate-limiting

可能/部分重复:

我正在寻找为Web应用程序实施移动时间窗口速率限制算法的最佳方法,以减少垃圾邮件或暴力攻击。

使用示例是“最近5分钟内来自给定IP的最大失败登录尝试次数”,“最近N分钟内的最大((帖子/投票/等等)...”。

我更喜欢使用移动时间窗口算法,而不是每隔X分钟重新统一一次(比如twitter api)。

这适用于C#/ ASP.Net应用程序。

6 个答案:

答案 0 :(得分:23)

我们发现Token Bucket是这种速率限制的更好算法。它广泛用于路由器/交换机,因此我们的操作人员更熟悉这个概念。

答案 1 :(得分:10)

使用基于内存的快速散列表,如memcached。密钥将是您限制的目标(例如IP),每个存储值的到期应该是最大限制时间。

为每个密钥存储的值将包含他们在执行操作时最后N次尝试的序列化列表,以及每次尝试的时间。

答案 2 :(得分:8)

只是添加一个更现代的'回答这个问题:对于.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()
});

答案 3 :(得分:2)

您会发现此页面很有趣:

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

要注意的部分如下:

  

防止拒绝服务(DOS)攻击

     

Web服务是黑客最有吸引力的目标,因为即使是学前黑客也可以通过反复调用服务昂贵的Web服务来关闭服务器。

编辑:类似的问题:

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

答案 4 :(得分:1)

我一直在研究一种新的基于 redis 的速率限制方法:http://blog.jnbrymn.com/2021/03/18/estimated-average-recent-request-rate-limiter.html

它比我见过的许多其他方法更简单,因为它不需要您不断创建新的 redis 密钥(例如,不是每个用户每分钟一个,而是每个用户一个)。它有一些关于“健忘和宽恕”的很好的属性,例如,滥用用户不能在下一分钟的窗口重新犯罪。它也有一个很好的解释,因为速率限制器的状态对应于用户最近请求速率的估计。

答案 5 :(得分:0)

我刚刚添加了Block API requests for 5 mins if API rate limit exceeds. 问题的答案  我使用HttpRuntime.Cache每分钟只允许60个请求。超过限制将在接下来的5分钟内阻止API。