如何在PHP中限制用户登录尝试次数

61

我刚阅读了这篇文章《网站认证的权威指南》,其中有关于防止快速登录尝试的内容。

最佳实践#1:一个短暂的时间延迟,随着失败次数的增加而逐渐增加,如下:

1次失败尝试=没有延迟
2次失败尝试=2秒延迟
3次失败尝试=4秒延迟
4次失败尝试=8秒延迟
5次失败尝试=16秒延迟
等等。

攻击此方案的DoS攻击是非常不现实的,但另一方面,这可能会是灾难性的,因为延迟呈指数增长。

我想知道如何在我的PHP登录系统中实现类似的功能?


4
请确保没有算术溢出,否则可能会导致负延迟。 - Hamish Grubijan
7
不要延迟,只需在x次尝试后完全阻止。当机器人尝试登录时发送404。没有必要通过调整延迟来使事情更复杂化。此外,人类失败3次(并获得长时间延迟)也是可能的。 - sestocker
29
@sestocker,实际上我建议在这里使用“418我是茶壶”而不是404。http://en.wikipedia.org/wiki/Http_status_codes; o) - deceze
1
@sestocker:你不想阻止登录有很多原因;DoS是一个原因,实用性是另一个原因(如果你的网站有数百万个账户,你不想手动重新激活你的用户)。此外,4或8秒对于人类来说不是一个“长时间”的延迟,但在暴力攻击中却是一个严重的麻烦。你应该将延迟限制在15或30分钟左右,并提供基于IP或cookie的“直接线路”,以便真正的用户不会因为多次失败的尝试而被锁定。详细信息请阅读链接的帖子。 - Jens Roland
2
4或8秒对于忘记密码并想要检查十几个变体的人来说是一个很长的延迟(“那是一个!还是@在结尾?”)。看看安卓如何处理屏幕锁定:5次尝试,延迟,5次尝试,延迟...这是一种更人性化的方法。 - Kos
显示剩余3条评论
11个回答

0
通常我会创建登录历史和登录尝试表。尝试表将记录用户名、密码、IP地址等信息。针对该表进行查询,以查看是否需要延迟。我建议在给定时间内(例如一小时)尝试次数超过20次时完全阻止登录。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接