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

可能/部分重复:

  • 什么是一个好的速率限制算法?
  • 限制方法在N秒内调用M个请求
  • 在ASP.NET MVC中实现请求限制的最佳方法?

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

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

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

这将是一个C#/ ASP.Net应用程序。

使用像memcached这样的基于内存的快速哈希表。 密钥将是您要限制的目标(例如IP),并且每个存储值的到期应该是最大限制时间。

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

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

只是为这个问题添加一个更“现代”的答案:对于.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服务来关闭服务器。

编辑:类似的问题:

在ASP.NET MVC中实现请求限制的最佳方法?

如果API速率限制超过,我刚刚将问题的答案添加到Block API请求5分钟。
我使用HttpRuntime.Cache每分钟只允许60个请求。 超过限制将在接下来的5分钟内阻止API。