1

我正在尝试为我们的一个面向公众的网站编写改进的密码重置功能,除了更好的验证码之外,我还想标记一个用户名,该用户名在 y 分钟内尝试登录但未成功 x 次。第一个想法是拥有一个记录每次尝试的数据库,然后在该时间的最大尝试次数之后 - 我们只需锁定帐户,直到收到员工经理的电话以重置它。

什么是不需要通过 SQL 持久化的更好方法。(Cookie/其他东西?)如果不存在,我该如何使用更清洁的方法来做到这一点?由于某种原因,我今天的大脑是满的

4

5 回答 5

3

检查有关限制它们的答案。
限制登录尝试

如果你好奇的话,Jeff Atwood 有一篇关于这个主题的有趣的博客文章。
http://www.codinghorror.com/blog/archives/001206.html

将它们存储在数据库中可能会变得乏味,并且您最终会担心登录尝试失败会导致表泛滥。此外,在用户的机器上存储一些控制它的东西也很棘手,因为他们可以控制他们机器上的所有文件,并且他们可以轻松地重置您的失败登录计数器,或者更糟糕的是,将错误/恶意数据发回给您。

于 2009-06-16T14:48:49.227 回答
1

使用 cookie 或会话会很糟糕,因为用户可以通过清除 cookie 来清除他们的登录尝试。也许使用临时目录中的文件来存储登录尝试是合适的?

于 2009-06-16T14:50:36.257 回答
1

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

于 2009-06-16T14:52:44.087 回答
1

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

于 2009-06-16T14:56:38.460 回答
1

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

于 2009-06-16T15:05:59.737 回答