php 在X失败尝试后阻止登录




mysql login (2)

我尝试在y尝试失败后阻止登录x分钟。 我已经计划登录用户登录,所以我想我可以使用相同的数据库来计算阻塞是否需要发生。

我的问题:

  • 使用相同的日志表来运行y失败尝试阻塞的逻辑是否有意义?
  • 有些人只是为失败的尝试提供一个表,我听说他们只是增加失败的登录数。 这是没有意义的,因为他们所存储的是失败的尝试次数,而不是在什么时间段内。 10分钟内3次失败的尝试不同于3天内3次失败的尝试。 时间跨度是否重要? 在一段时间内x次失败尝试,周期或x次失败尝试后,你是否阻止? 什么是最好的时间框架?
  • 有人可以澄清最佳实践方法吗?

你需要所谓的密码尝试窗口。

数据库中基本上有两个字段,一个LastPasswordAttempt(datetime)和PasswordAttemptCount(int)

然后在每次登录时,检查最后一次LastPasswordAttempt发生的时间,以及是否已经过了10分钟 - 增加PasswordAttemptCount,否则将其重置为0(或1,因为他们刚刚失败)。

在相同的逻辑中,检查PasswordAttemptCount是否等于5或更多,如果是 - 拒绝用户访问。 你可以有第三个领域锁定他们几个小时或一天。

即可以从最后一次密码尝试中设置为一天的CanLoginAfter(日期时间)。

希望这可以帮助


一种方法是做到这一点:

  • user_lockout: user_id, expires_dt (可能是普通用户表的一部分)
  • failed_login_log: user_id, dt (可能是另一个日志表的一部分)

在任何user_id登录尝试之后,检查以确保expires_dt过去或NULL。 (如果将来,账户被锁定。)

登录失败后,将记录插入到failed_login_log ,然后记录过去X分钟内失败登录的次数( WHERE dt > DATE_SUB(NOW(), INTERVAL x MINUTES) )。

如果该计数大于Y,则将user_lockout.expires_dt更新为NOW() + Z MINUTES

这允许您在X分钟内失败尝试后Z分钟锁定账户。





statistics