可能/部分重复:
我正在寻找为Web应用程序实施移动时间窗口速率限制算法的最佳方法,以减少垃圾邮件或暴力攻击。
使用示例是“最近5分钟内来自给定IP的最大失败登录尝试次数”,“最近N分钟内的最大((帖子/投票/等等)...”。
我更喜欢使用移动时间窗口算法,而不是每隔X分钟重新统一一次(比如twitter api)。
这适用于C#/ ASP.Net应用程序。
答案 0 :(得分:23)
我们发现Token Bucket是这种速率限制的更好算法。它广泛用于路由器/交换机,因此我们的操作人员更熟悉这个概念。
答案 1 :(得分:10)
使用基于内存的快速散列表,如memcached。密钥将是您限制的目标(例如IP),每个存储值的到期应该是最大限制时间。
为每个密钥存储的值将包含他们在执行操作时最后N次尝试的序列化列表,以及每次尝试的时间。
答案 2 :(得分:8)
只是添加一个更现代的'回答这个问题:对于.NET WebAPI,WebApiThrottle非常出色,可能会开箱即用。
实施只需一分钟左右,并且可以高度自定义:
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服务来关闭服务器。
编辑:类似的问题:
答案 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。