防止对Web应用程序的字典攻击

时间:2010-05-07 06:28:13

标签: security

防止字典攻击的最佳方法是什么?我已经想到了几个实现,但它们似乎都有一些缺陷:

  1. 在X登录尝试失败后锁定用户。问题:很容易变成拒绝服务攻击,在很短的时间内锁定了许多用户。
  2. 逐次增加用户登录尝试失败的响应时间。问题:字典攻击可能使用相同的密码,但使用不同的用户名。
  3. 从IP地址逐次增加每次登录尝试失败的响应时间。问题:通过欺骗IP地址轻松绕过。
  4. 会话中每次失败登录尝试的响应时间会逐渐增加。问题:通过创建字典攻击很容易解决,每次尝试都会激活一个新会话。

8 个答案:

答案 0 :(得分:21)

我非常喜欢gmail的反暴力系统。它基于用户可以累积的“热量”,在用户过热后,它们被提示用验证码。您可以使用sql数据库或使用redis incr跟踪热量。将热量分配给IP地址。 因为three-way-handshake而无法“欺骗”互联网上的tcp连接,但代理服务器很多且IP地址非常便宜。代理服务器通常用于发送垃圾邮件,您可以检查blacklist并自动提示他们获取验证码。

针对您系统的每个不良操作都会更新热表。例如,登录失败将累积35%的热量。一旦热水平大于或等于100%,则用户被迫解决验证码。解决验证码将“冷却”该IP地址。热表可以包含时间戳列,该列设置为更新时的当前时间。大约24小时后,热量可以恢复到0。

reCaptcha是您可以使用的最安全的验证码。

答案 1 :(得分:3)

我一直是您的选择3的粉丝 - 根据其IP地址锁定或限制客户端。由于你所陈述的原因,其他选择都比它们的价值更麻烦。

欺骗IP地址是可能的,但它并没有打败这种反措施。如果你的意思是技术意义上的“欺骗” - 伪造TCP数据包标题 - 那么攻击者就不会那么好,因为即使他们猜测正确的密码,他们也不会收到告诉他们的响应。当然,他们仍然可以使用代理,但代理的数量是有限的。即使攻击者拥有1,000个工作代理,您也可以允许每次尝试10次尝试10,000次。如果你强制执行任何密码复杂性(例如要求使用字母数字密码),那么这就不足以猜测。

仅此一项就足以阻止大多数脚本小子。如果你面对一个更坚定的攻击者,你可能不得不实施某种站点范围的监视,它会检测到有很多尝试(因此可能会发生攻击)并以某种方式“锁定”,例如。通过使用CAPTCHAs。我不是一直都在使用CAPTCHA的粉丝 - 他们只是比他们的价值更烦恼。

最终,由用户选择安全密码(尽管您可以帮助他们)。如果他们选择“Password1”作为他们的密码,那么你所能做的就是阻止黑客入侵他们的帐户。

答案 2 :(得分:1)

也许您需要在网络表单上实施CAPTCHA

答案 3 :(得分:1)

在安全性,可用性和可用性之间存在永恒的权衡,这意味着没有完美的解决方案。

根据您的具体情况,一个不错的权衡是使用选项#1和验证码。尝试三次失败后锁定帐户,但如果验证码已正确解析,则允许后续登录尝试。

答案 4 :(得分:1)

我还建议使用选项3.虽然它对于拥有大量代理(或僵尸网络)的攻击者来说效果不佳,但我仍然认为这是大多数网站的最佳答案。 (Gmail与大多数网站的威胁不同,因此需要不同的响应。)

一个现实世界的例子:
我参与的一个大型在线游戏记录了过去5分钟内每个IP地址失败的登录尝试次数。当任何一个IP地址累积5次不良登录尝试(无论成功尝试的次数)时,该地址将被阻止45分钟。

为什么会这样做
我坐下来确定一个非常聪明的黑客能够用每100次尝试中的一次(可能更糟糕)打破字典帐户。因此,更糟糕的情况是攻击者每100分钟(每个IP地址)中断一个帐户。对于针对此特定站点的威胁,这是足够的保护。我们的账户真的不值那么多。您需要确定(对于您的站点)您需要多少保护。如果你想让窗口延长3倍,你可以将窗口扩展到30分钟。

重要提示
成功登录后,重置计数(无论是解决方案3还是上述热图)。如果你这样做,攻击者只会尝试攻击3个帐户,然后成功登录到他们已经控制的某个帐户(他们或已经被入侵的帐户),并且永远不会受到限制。

答案 5 :(得分:1)

首先,请阻止用户选择常用密码。在数据库中添加“黑名单”并检查新密码。您可以使用许多密码或单词列表中的一个来填充它,例如:

http://securityoverride.org/infusions/pro_download_panel/download.php?did=66

其次,考虑临时锁定。如果您有“用户”表,请添加“LastLoginAttemptedOn”和“FailedLoginAttempts”列。每次用户尝试登录时都会更新这些值。当用户成功登录时,将FailedLoginAttempts重置为0.当FailedLoginAttempts达到4(或您喜欢的任何内容)时,不要让用户尝试登录5分钟(再次,您的偏好)来自LastLoginAttemptedOn。在实际允许它们尝试阻止4分钟后尝试重置计时器之前,请不要更新此列。当计时器重置时,将FailedLoginAttempts重置为0,以便再重试几次。

答案 6 :(得分:0)

这取决于你所说的“预防”。

如果您不希望它们浪费您的带宽,那么限制,锁定等是可行的选择。有热量表的开销 - 你必须创建和维护逻辑,存储和管理“热图”等等。我还看到一些基于ip地理定位的系统抛出验证码或改变其日志如果用户尝试从“远程”或“未知”IP登录,则在配置文件中。

如果您只想大幅度降低字典攻击的有效性,请使用除密码哈希之外的salt。

答案 7 :(得分:0)

如果您正在为安全性非常重要的应用程序进行编程,则可以禁止包含字典单词的密码。 您不必将QWERTY作为有效密码。