X尝试失败后阻止登录

时间:2010-07-04 23:11:13

标签: php mysql login statistics

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

我的问题:

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

2 个答案:

答案 0 :(得分:7)

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

数据库中基本上有2个字段,一个是LastPasswordAttempt(datetime),另一个是PasswordAttemptCount(int)

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

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

即。 CanLoginAfter(datetime),您可以将其设置为上次尝试密码的一天。

希望这有帮助

答案 1 :(得分:1)

一种方法是这样做:

  • 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分钟内Y尝试失败后将帐户锁定Z分钟。

相关问题