可能/部分重复:
我正在寻找一种最佳方式来实现一个动态时间窗口限速算法,用于减少网络应用程序中的垃圾邮件或暴力攻击。
使用示例包括“最大登录尝试失败次数(来自特定IP)在过去的5分钟内”,“最近N分钟内的最大(帖子/投票/等等...)数量”。
我更喜欢使用一个动态时间窗口算法,而不是每隔X分钟进行硬重置统计的方法(例如Twitter API)。
这将用于C#/ASP.Net应用程序。
可能/部分重复:
我正在寻找一种最佳方式来实现一个动态时间窗口限速算法,用于减少网络应用程序中的垃圾邮件或暴力攻击。
使用示例包括“最大登录尝试失败次数(来自特定IP)在过去的5分钟内”,“最近N分钟内的最大(帖子/投票/等等...)数量”。
我更喜欢使用一个动态时间窗口算法,而不是每隔X分钟进行硬重置统计的方法(例如Twitter API)。
这将用于C#/ASP.Net应用程序。
我们发现对于这种速率限制,令牌桶算法是更好的算法。它在路由器/交换机中被广泛使用,因此我们的运维人员更熟悉这个概念。
为了对这个问题增加一个更“现代”的答案:对于 .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()
});
使用像memcached这样快速的基于内存的哈希表。键将是您所限制的目标(例如,IP地址),每个存储值的过期时间应为最大限制时间。
每个键存储的值将包含一个序列化列表,其中包含他们尝试执行该操作的最后N次尝试以及每次尝试的时间。
您发现这个页面很有趣:
http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx
需要注意的部分如下:
防止拒绝服务(DOS)攻击
Web服务是黑客最感兴趣的目标,因为即使一个幼儿园级别的黑客也可以通过重复调用执行昂贵操作的Web服务来使服务器崩溃。
编辑: 类似的问题在这里: