1

我想采取措施阻止人们试图破解我网站上的用户帐户。对于只需要尝试几个密码来记住的客户来说,这背后的最佳流程是什么?

我注意到谷歌在几次尝试失败后显示了一个验证码图像。我从来没有尝试过足够的努力,但我敢肯定,经过多次尝试,他们一定会阻止你。

确保某人不尝试使用蛮力方法来访问帐户是最佳做法吗?

验证码?阻止他们的 IP 地址(如果他们在共享 IP 上,这是否有效)?

4

2 回答 2

1

您最好的选择是在设定的时间段内(例如滚动 30 分钟的窗口)以相对较高的尝试次数(10 或 20 次左右)为每个用户名锁定(10 分钟、15 分钟等)。通过将尝试次数设置为高于 3 或 5 次,普通用户将在锁定命中之前放弃或尝试重置密码。

您可以考虑记录失败的尝试数据(IP、用户名、时间戳等),以了解正常用户行为和蛮力尝试之间的行为差​​异。这将允许您随着时间的推移完善您的政策。

还要考虑一个强密码策略(至少 8 个以上的字符和至少一个数字)。

您还可以考虑某种形式的多因素身份验证。您提到了验证码,但您可能会发现许多其他有用的技术。如果他们无法识别用户的 IP 地址,我使用的一个站点会将令牌通过电子邮件发送到用户的电子邮件地址,并且用户必须出示该令牌才能从新 IP 地址访问。

于 2012-05-26T05:26:12.980 回答
1

在一定次数的尝试后将用户锁定和/或在再次接受进一步的登录尝试后延长其所花费的时间的方案当然是一个好主意。和 CAPTCHA 一样(除了烦人 :)但是,在我看来,只有当你有强大的硬件支持你时,它们才有意义。

我认为只有在你有资源的情况下才应该尝试这样做的原因是,你必须记住,这样的方案需要你记住最近对系统中可能的每个用户所做的尝试。当然,有很多方法可以持久化信息,它们的效果各不相同:内存缓存、数据库等。

但无论如何,这样的机制会给你的应用程序带来额外的负载,而且也有不利的一面:如果攻击者对你的应用程序感到厌烦或恼火,他们还不如尝试通过拒绝服务攻击来解决它。需要保留大量信息的复杂登录方案将有助于实现这一目标。

如果您决定应用这样的功能,我建议您首先在实验室中对其进行大量压力测试,以了解“您可以承受多少” - 这样您就可以确定是否需要升级硬件: )

不需要持久性的一种更简单的方法是应用密码散列,如 PBKDF2、bcrypt 或 scrypt。这些人为地减慢攻击者的速度,使攻击者尽可能地困难。但请注意,这些也会给您的应用程序带来额外的计算压力(尽管可能小于上述措施),所以我还是会先做一些压力测试。

于 2012-05-26T13:41:54.810 回答