我见过对用户登录尝试有限制的网络应用程序。
这是安全必要性吗?如果是,为什么?
例如: 您有 3 次登录尝试失败,让我们在 10 分钟后重试!
我见过对用户登录尝试有限制的网络应用程序。
这是安全必要性吗?如果是,为什么?
例如: 您有 3 次登录尝试失败,让我们在 10 分钟后重试!
我曾经看到过一种创造性的方法......
对于每次失败的登录尝试,锁定时间都会增加......呈指数级增长。
attempt | lockout time
======================
1 | 2s
2 | 4s
3 | 8s
4 | 16s
5 | 32s
6 | 64s
7 | 128s
8 | 256s
9 | 512s
10 | 1024s
从理论上讲,它会让用户犯一两个错误,但一旦它看起来成为“黑客”尝试,黑客就会被锁定越来越长的时间。
我自己(还)没有使用过这个,但从概念上讲我非常喜欢这个想法。当然,成功登录后,计数器会重置。
限制在网站上进行多少次尝试是为了防止暴力(自动)攻击您的网站。如果您不限制这些尝试,黑客可以设置一个脚本来不断猜测密码,直到找到密码,这可能会影响您的 Web 服务器的可用性。
通常,您可能希望在 3 次尝试后让用户超时(如您提到的 10 分钟),并在连续重复尝试 6 或 9 次后将其锁定,迫使用户与您联系以解锁他们的帐户。这是因为有人可以修改他们的脚本来调整你的超时。
如果用户可以设置自己的密码,一些 bot/kid 会尝试使用常用密码列表登录,并成功。如果他们不认识任何用户,他们会尝试常用名称,如 admin、simon、rico 等。
仅在会话中标记用户无济于事,因为他们只需删除 cookie 或查询参数即可。您需要计算 IP 和登录名的失败登录尝试次数。也许对 IP 更加宽容,因为它可以在许多用户之间共享。
澄清 这是对其他答案的补充。例如,使用良好实施的验证码以及使用会话的反暴力机制。
发问者将此标记为已接受,假设机器无法读取验证码(她几乎是对的),因此它得到了负面评价,因为人们认为这不是一个完整的答案并且他们是对的。
此外,使用良好实施的 CAPTCHA 可能是增强您的应用程序安全性以抵御暴力攻击的另一种方法。有各种各样的免费验证码提供商,如果您赶时间,让我们试试简单的方法。还请考虑这里有人说“哦,不!这个验证码不够安全,有时他们是对的!” .
“对于那些不知道的人来说,CAPTCHA 是一种可以判断其用户是人类还是另一台计算机的程序。它们是您在注册 Gmail 或发表评论时翻译的扭曲文本的小图像在某人的博客上。他们的目的是确保某人不会使用计算机自动注册数百万个在线帐户,或者..” ref。
对于我自己的项目,我编写了一个通用的“洪水控制”库来处理这类事情。
它允许我指定在 X 时间内可以进行多少次尝试。它允许在短时间内进行一定数量的“宽限”尝试,因此只会捕获真正不寻常的行为。
我在数据库中记录了一些东西:
对于每次尝试,我都会查询部分 IP 地址和操作,如果之前的尝试是在某个时间窗口内进行的,那么我会增加该尝试的尝试计数器。如果尝试计数器超过允许的宽限尝试次数,那么我检查最后一次尝试是否在 X 秒内,如果是,则返回 false - 因此该操作将被阻止(并且用户将被告知在尝试前等待 X 秒再次)。如果尝试计数器低于宽限尝试次数,那么我返回 true 并让它滑动。
如果以后有相同IP的人过来,则不会获取之前的尝试计数,因为它太早了。
是的,有必要保护帐户免受复杂的蛮力攻击 - 例如使用机器人和字典文件 - 甚至只是试图猜测帐户密码的人。
我认为在数据库中放置一个“失败尝试”计数器将是最安全和最简单的方法。这样用户就无法绕过它(通过禁用 cookie)。当然,在成功登录时重置。
您可以按 IP 和/或用户名计数。IP 的优势在于您可以阻止一个人试图入侵多个帐户。如果您按用户名计数,您可以阻止使用服务器场的人,并且不会意外限制同一网络上的人。
在正确登录后重置失败的尝试几乎会使整个系统变得毫无价值。
然后,任何注册用户都可以对其他人的帐户和密码进行三次猜测,然后用他们自己的登录来重置计数器,然后重复——这也可以自动化。例如,普通注册用户可以暴力破解管理员密码。
重置需要由管理员完成,而不是简单地登录成功。