我正在尝试为我们面向公众的网站编写一个改进的密码重置功能,除了更好的验证码之外,我想要标记一个用户名,该用户名在y分钟内尝试登录w / no success x次。第一个想法是建立一个记录每次尝试的数据库,然后在当时的最大尝试次数之后 - 我们只需锁定帐户,直到从员工的经理那里收到一个电话来重置它。

什么是不需要通过SQL持久化的更好方法。 (Cookie /其他什么?)如果不存在,我怎么能用更干净的方法做到这一点? 由于某种原因,我的大脑今天已经满了

有帮助吗?

解决方案

查看关于限制它们的答案。
限制登录尝试

杰夫阿特伍德有一篇有趣的博客文章,关于这个问题,以防你好奇。
http://www.codinghorror.com/blog/archives/001206.html

将它们存储在数据库中可能会变得乏味,并且您最终会担心因登录尝试失败而淹没您的表。此外,在用户控制此操作的计算机上存储内容也很棘手,因为它们可以控制计算机上的所有文件,并且可以轻松地重置失败的登录计数器,或者更糟糕的是,向您发送错误/恶意数据。

其他提示

使用Cookie或会话会很糟糕,因为用户只需清除Cookie即可清除登录尝试。也许使用临时目录中的文件存储登录尝试是否合适?

一个cookie对攻击者没有用处(他们只是删除cookie或者不发送给你)。如果你有内存中的应用程序状态,你可能可以使用它,但是你必须非常小心,因为这样做可能会导致你很快填满你的内存,除了由于并发性而遇到可扩展性问题锁定。甚至这可能不适用于在许多不同服务器上运行的应用程序,因为这些服务器之间可能不共享该应用程序状态。为什么你认为在数据库中存储数据是一个坏主意?

您可以使用数据库,使用memcache并设置cron作业以定期转储表。您也可以使用cookie或会话变量,但出于安全原因,我不会依赖这些。

请注意,破解者的目标可能不是访问您的系统,而是让它对每个人都无法使用。他可以通过自愿使用虚假凭据登录来阻止您网站上的某些用户来实现这一目标!我想如果没有数据库,你将找不到任何适当的解决方案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top