可能/部分重复:
我正在寻找为 Web 应用程序实现移动时间窗口速率限制算法以减少垃圾邮件或暴力攻击的最佳方法。
使用示例是“过去 5 分钟内来自给定 IP 的最大失败登录尝试次数”、“过去 N 分钟内(帖子/投票/等)的最大数量”。
我更喜欢使用移动时间窗口算法,而不是每 X 分钟硬重置一次统计数据(如 twitter api)。
这适用于 C#/ASP.Net 应用程序。
可能/部分重复:
我正在寻找为 Web 应用程序实现移动时间窗口速率限制算法以减少垃圾邮件或暴力攻击的最佳方法。
使用示例是“过去 5 分钟内来自给定 IP 的最大失败登录尝试次数”、“过去 N 分钟内(帖子/投票/等)的最大数量”。
我更喜欢使用移动时间窗口算法,而不是每 X 分钟硬重置一次统计数据(如 twitter api)。
这适用于 C#/ASP.Net 应用程序。
我们发现Token Bucket是这种限速的更好算法。它广泛用于路由器/交换机,因此我们的操作人员更熟悉这个概念。
使用像memcached这样的基于内存的快速哈希表。密钥将是您要限制的目标(例如 IP),每个存储值的到期时间应该是最大限制时间。
为每个键存储的值将包含他们在执行操作时最近 N 次尝试的序列化列表,以及每次尝试的时间。
只是为这个问题添加一个更“现代”的答案:对于 .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()
});
如果 API 速率限制超出,我刚刚添加了 Block API requests for 5 mins问题的答案。
我过去HttpRuntime.Cache
每分钟只允许 60 个请求。超过限制将在接下来的 5 分钟内阻止 API。
你会发现这个页面很有趣:
http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx
要注意的部分如下所示:
防止拒绝服务 (DOS) 攻击
Web 服务对黑客来说是最有吸引力的目标,因为即使是学龄前的黑客也可以通过重复调用 Web 服务来破坏服务器,而这会造成昂贵的工作。
编辑:这里有类似的问题:
我一直在研究一种新的基于 redis 的速率限制方法: http ://blog.jnbrymn.com/2021/03/18/estimated-average-recent-request-rate-limiter.html
它比我见过的许多其他方法更简单,因为它不需要您不断创建新的 redis 键(例如,不是每个用户每分钟窗口一个,而是每个用户一个)。它有一些关于“健忘和宽恕”的好特性,例如,滥用用户不能在下一分钟窗口内再次犯罪。它也有一个很好的解释,因为速率限制器的状态对应于用户最近请求率的估计。