在PHP中限制用户登录尝试

在PHP中限制用户登录尝试,php,security,login,captcha,brute-force,Php,Security,Login,Captcha,Brute Force,我见过对用户登录尝试有限制的web应用程序 这是安全需要吗?如果是,为什么 例如:您有三次登录尝试失败,让我们在10分钟后重试 限制在网站上进行多少次尝试以防止暴力(自动)攻击您的网站。如果您不限制这些尝试,黑客可以设置一个脚本,在找到密码之前一直猜测密码,这可能会影响web服务器的可用性 通常,您可能希望在尝试3次后将用户超时(如您所述,10分钟),并在连续重复尝试6或9次后将其锁定,迫使用户联系您以解锁其帐户。这是因为有人可以修改他们的脚本来调整您的超时时间。是的,有必要保护帐户免受复杂的暴

我见过对用户登录尝试有限制的web应用程序

这是安全需要吗?如果是,为什么


例如:您有三次登录尝试失败,让我们在10分钟后重试

限制在网站上进行多少次尝试以防止暴力(自动)攻击您的网站。如果您不限制这些尝试,黑客可以设置一个脚本,在找到密码之前一直猜测密码,这可能会影响web服务器的可用性


通常,您可能希望在尝试3次后将用户超时(如您所述,10分钟),并在连续重复尝试6或9次后将其锁定,迫使用户联系您以解锁其帐户。这是因为有人可以修改他们的脚本来调整您的超时时间。

是的,有必要保护帐户免受复杂的暴力攻击,例如使用机器人和字典文件,甚至有人试图猜测帐户的密码。

如果用户可以设置自己的密码,一些机器人/小孩会尝试使用常用密码列表登录,并成功。如果他们不认识任何用户,他们会尝试使用常见的名称,如admin、simon、rico等


仅仅在会话中标记用户是没有帮助的,因为他们可以删除cookie或查询参数。您需要有IP和登录名的失败登录尝试计数。可能会更宽容IP,因为它可以在许多用户之间共享。

澄清这是对其他答案的补充。在使用会话等反暴力机制的同时,使用良好实施的验证码。
提问者将此标记为已接受,假设机器无法读取CAPTCHA(她几乎是对的),因此得到了否定的分数,因为人们认为这不是一个完整的答案&他们是对的


此外,使用良好实现的验证码可能是增强应用程序安全性以抵御暴力攻击的另一种方法。有一个免费的,如果你赶时间,让我们试试简单的方法。另外,请考虑,这里有说“哦,不!这个CAPTCHA的东西是不够安全的,他们有时是正确的!”
“对于那些不知道的人来说,验证码是一种可以判断用户是人类还是其他计算机的程序。当你注册Gmail或者在别人的博客上留言时,你会翻译这些扭曲文本的小图片。他们的目的是确保不会有人使用计算机自动注册数百万个在线帐户,或者

它允许我指定在X时间内可以进行多少次尝试。它允许在短时间内进行一定数量的“宽限”尝试,以便只捕获真正不寻常的行为

我在数据库中记录了一些事情:

  • IP地址(或其前24位)
  • 尝试的操作(即“登录”、“搜索”、“评论”)
  • 尝试的时间
  • 尝试次数(尝试计数器)
对于每次尝试,我都会查询部分IP地址和操作,如果以前的尝试是在某个时间窗口内进行的,则我会增加该尝试的尝试计数器。如果尝试计数器超过允许的宽限尝试次数,则我会检查最后一次尝试是否在现在的X秒内,如果是,则return false-因此操作将被阻止(并且会告诉用户在重试之前等待X秒)。如果尝试计数器低于宽限尝试次数,则我返回true并让其滑动


如果具有相同IP的人稍后到达,则不会获取以前的尝试计数,因为这将是很久以前的事了。

我曾经看到一种创造性的方法

对于每一次失败的登录尝试,锁定时间都会呈指数级增加

attempt | lockout time
======================
   1    |     2s
   2    |     4s
   3    |     8s
   4    |    16s
   5    |    32s
   6    |    64s
   7    |   128s
   8    |   256s
   9    |   512s
  10    |  1024s
理论上,它允许用户犯一两个错误,但一旦它成为“黑客”企图,黑客就会被锁定越来越长的时间


我自己还没有用过这个,但从概念上讲我很喜欢这个主意。当然,成功登录后,计数器会重置。

我认为在数据库中放置“失败的尝试”计数器是最安全、最简单的方法。这样用户就不能绕过它(通过禁用cookies)。当然,成功登录后重置


您可以通过IP和/或用户名进行计数。IP的优点是,您可以阻止一个人尝试入侵多个帐户。如果您通过用户名进行计数,您可以阻止使用服务器场的人,并且不会意外地限制同一网络上的人。

在正确登录后重置失败的尝试几乎使整个系统一文不值

然后,任何注册用户都可以对其他人的帐户和密码进行三次猜测,然后用自己的帐户登录以重置计数器,然后重复-这也可以自动进行。例如,普通注册用户可以强制使用管理员密码


重置需要由管理员完成,而不是简单地成功登录。

因此,当用户凭据失败时,我必须执行代码&当电子邮件地址(例如)失败时,不需要执行此代码有一个无效的格式。是吗?通过cookies来实现还是我必须使用dbs来实现?谢谢你的回复:)这取决于你希望你的站点有多安全。确定你需要做什么的最好方法是记录每次尝试…每次用户登录时,跟踪他们的电子邮件、用户名、ip地址以及他们的密码是否正确。(继续…)小心不要登录键入的实际密码。如果你看到一个趋势,改变你的代码来解释它。我不会考虑一个打字攻击用户,除非人们开始ABUS。