限制登录尝试

时间:2009-02-20 16:11:31

标签: security language-agnostic login throttling

(这是一个与语言无关的问题,但在我的情况下我使用的是ASP.NET 3.5)

我正在使用标准的ASP.NET login control,并希望实现以下失败的登录尝试限制逻辑。

  • 处理OnLoginError事件,并在Session中维护失败的登录尝试次数
  • 当此计数达到 [某些可配置值] 时,阻止来自原始IP地址或该用户/那些用户进行1小时的进一步登录尝试

这听起来像是一种明智的做法吗?我是否错过了可以绕过这种检查的明显方法?

注意:ASP.NET Session使用cookie与用户的浏览器相关联

修改

这适用于仅在英国和印度使用的管理网站

5 个答案:

答案 0 :(得分:14)

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

这样可以降低这种保护措施可能被滥用于拒绝服务攻击的风险。

请参阅http://www.codinghorror.com/blog/archives/001206.html

答案 1 :(得分:14)

您要做的最后一件事是将所有不成功的登录尝试存储在数据库中,这种方法运行良好,但也会使DDOS攻击无法使数据库服务器崩溃。

您可能在网络服务器上使用某种类型的服务器端缓存,memcached或类似的。这些是用于跟踪IP地址和/或用户名失败尝试的完美系统。如果超过登录尝试失败的特定阈值,则可以决定停用数据库中的帐户,但是您将保存对您不需要的失败登录计数器的持久存储的大量读写操作。持续。

如果您试图阻止人们进行暴力破解身份验证,那么Gumbo建议的限制系统可能效果最佳。它会使暴力攻击对攻击者不感兴趣,同时在正常情况下甚至在攻击发生时最大限度地减少对合法用户的影响。我建议只计算在memcached或类似的IP中不成功的尝试,如果你曾经成为极度分布式暴力攻击的目标,你总是可以选择开始跟踪每个用户名的尝试,假设攻击者是实际上经常尝试相同的用户名。只要尝试不是非常分散,就像仍然来自可数量的IP地址一样,初始的by-IP代码应该能够让攻击者充分利用。

防止来自IP地址数量有限的国家/地区访问者出现问题的关键是不要使您的阈值过于严格;如果你在几秒钟内没有收到多次尝试,你可能没有太多担心重新。脚本强暴。如果您更关心尝试手动解开其他用户密码的人,可以通过用户名为后续失败的登录尝试设置更宽的边界。

另一个不能回答您的问题但又有些相关的建议是对最终用户强制实施一定级别的密码安全性。我不会过分需要一个混合大小写,至少x个字符,非字典等等密码,因为你还不想在他们还没有注册的时候给人们带来太大的麻烦,但是简单地阻止人们使用他们的用户名作为他们的密码应该有很长的路要走,以保护你的服务和用户免受最不成熟的 - 猜他们为什么称他们为暴力;) - 攻击。

答案 2 :(得分:10)

接受的答案会在连续登录尝试中插入越来越多的延迟,这可能会在ASP.NET中执行得非常糟糕,具体取决于它的实现方式。 ASP.NET使用线程池来处理请求。一旦此线程池耗尽,传入的请求将排队,直到线程可用。

如果使用Thread.Sleep(n)插入延迟,则会在延迟期间占用ASP.NET线程池线程。该线程将不再可用于执行其他请求。在这种情况下,简单的DOS风格攻击将是继续提交您的登录表单。最终,每个可用于执行请求的线程都将处于休眠状态(并且会增加一段时间)。

我能想到正确实现这种延迟机制的唯一方法是使用异步HTTP处理程序。见Walkthrough: Creating an Asynchronous HTTP Handler。实施可能需要:

  1. 在BeginProcessRequest期间尝试身份验证并确定失败时的延迟
  2. 返回一个IAsyncResult,公开将在延迟
  3. 后触发的WaitHandle
  4. 确保在EndProcessRequest中触发了WaitHandle(或阻止它直到)

答案 3 :(得分:7)

这可能会影响您的真正用户。对于前者在新加坡等国家,ISP的数量有限,家庭用户可以使用较少的IP。

或者,您可以在x尝试阻止脚本小子之后插入验证码。

答案 4 :(得分:4)

我认为你需要在会​​话之外保留计数 - 否则琐碎的攻击是在每次登录尝试之前清除cookie。

否则计数和锁定是合理的 - 尽管更简单的解决方案可能是在每次登录失败之间加倍超时。即首次登录尝试后2秒,下一次登录后4秒,等等

您通过在超时期限内拒绝登录来实现超时 - 即使用户提供了正确的密码 - 只需回复人类可读文本,说明该帐户已被锁定。

同时监控相同的ip /不同的用户和相同的用户/不同的ip。