(这在原则上是一个与语言无关的问题,尽管在我的例子中我使用的是ASP.NET 3.5)
我正在使用标准的ASP.NET login control,并希望实现以下失败的登录尝试节流逻辑。
OnLoginError
事件,并在Session中维护这听起来像是一种明智的方法吗?我是不是错过了一种可以绕过这种检查的明显方式?
注意: ASP.NET会话使用cookie与用户的浏览器相关联
编辑
这是一个只会在英国和印度使用的管理网站
发布于 2009-02-20 16:21:15
Jeff Atwood提到了另一种方法:不是在多次尝试后锁定帐户,而是增加时间,直到允许再次尝试登录:
1st failed login no delay
2nd failed login 2 sec delay
3rd failed login 4 sec delay
4th failed login 8 sec delay
5th failed login 16 sec delay
这将降低此保护措施被滥用于拒绝服务攻击的风险。
发布于 2009-02-21 15:02:01
你想做的最后一件事是把所有不成功的登录尝试都存储在一个数据库中,这将足够好地工作,但也会使DDOS攻击变得非常微不足道,从而使你的数据库服务器瘫痪。
您可能正在are服务器上使用某种类型的服务器端缓存,memcached或类似的。这些都是通过IP地址和/或用户名跟踪失败尝试的完美系统。如果失败的登录尝试超过了某个阈值,那么您可以决定停用数据库中的帐户,但您将为不需要保留的失败登录计数器保存对持久存储的大量读取和写入。
如果你试图阻止人们进行暴力强制认证,像Gumbo建议的节流系统可能效果最好。它将使攻击者对暴力暴力攻击失去兴趣,同时在正常情况下甚至在攻击进行时将对合法用户的影响降至最低。我建议只计算memcached或类似的IP不成功的尝试,如果你成为极端分布式暴力暴力攻击的目标,你总是可以选择也开始跟踪每个用户名的尝试,假设攻击者实际上经常尝试相同的用户名。*只要尝试不是非常分散的,由于仍然来自数量可观的IP地址,初始的按IP代码应该足以阻止攻击者。
防止来自IP地址数量有限的国家的访问者出现问题的关键是不要将阈值设置得太严格;如果您在几秒钟内没有收到多次尝试,您可能不必太担心re。脚本暴力。如果你更关心的是有人试图手动破解其他用户的密码,你可以通过用户名为后续失败的登录尝试设置更宽的界限。
另一个建议,虽然没有回答你的问题,但有一定的相关性,那就是对你的最终用户实施一定级别的密码安全保护。我不会过分要求大小写混合的密码,至少x个字符,非字典等,因为你不想在人们还没有注册的时候给他们带来太多麻烦,但简单地阻止人们使用他们的用户名作为密码应该会对保护你的服务和用户免受最简单的攻击(猜猜他们为什么叫他们蛮力;)有很大的帮助。
发布于 2009-10-24 00:43:26
可接受的答案会在连续的登录尝试中插入越来越多的延迟,根据它的实现方式,它在ASP.NET中的性能可能会非常差。ASP.NET使用线程池为请求提供服务。一旦这个线程池耗尽,传入的请求将被排队,直到有线程可用。
如果使用Thread.Sleep(n)插入延迟,则会在延迟期间占用一个ASP.NET线程池线程。此线程将不再可用于执行其他请求。在这种情况下,一个简单的DOS风格的攻击就是不断提交您的登录表单。最终,每个可用于执行请求的线程都将处于休眠状态(并且持续时间越来越长)。
我能想到的正确实现这种延迟机制的唯一方法是使用异步HTTP处理程序。参见Walkthrough: Creating an Asynchronous HTTP Handler。实现可能需要:
中触发(或阻止,直到触发) WaitHandle
https://stackoverflow.com/questions/570160
复制相似问题