为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。