2010-07-04 208 views
4

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

我的问题:

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

我发现在两次尝试之间只需加倍延迟时间,所以前几次尝试很快,但过了一段时间它变得非常漫长,但Marko有很好的建议。 – 2010-07-04 23:25:15

+0

如果我们正确回答您的问题,请接受该答案。干杯:) – Marko 2010-07-05 20:50:32

回答

7

你需要什么叫密码尝试窗口。

基本上在数据库中的2场,一个LastPasswordAttempt(日期时间)和PasswordAttemptCount(INT)

然后在每次登录时,检查当最后LastPasswordAttempt发生,如果它已经在过去比如10分钟 - 递增PasswordAttemptCount,否则将其重置为0(或1,因为他们刚刚失败)。

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

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

希望这有助于

+7

要警惕你如何去做这件事。如果你有一个公共站点,在用户交互的情况下,这可以被用来恶意地将人员从他们自己的账户中锁定出来。因此,要么给合法用户一些方法来取消锁定 - 电子邮件或其他方式或使用更短的时间。否则你有时会让用户恼火。 – 2010-07-04 23:31:16

+1

我同意@MrXexxed - 当然他们将不得不猜测用户名。 – Marko 2010-07-04 23:32:49

+0

@Marjo Ivanovski的确他们会。如果一个网站使用电子邮件或单独的屏幕名称输入用户名会更加困难,但仍然有网站的用户名是屏幕名称,并且在这种情况下,如果他们是发布评论,帖子或其他任何内容的网站,可以使用反对他们。如果没有,无论如何它都不是问题。 – 2010-07-04 23:35:33

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_dtNOW() + Z MINUTES

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