如何避免滥用忘记密码表单

How to avoid abusive use of forgot password form

问题:

我已经构建了一个 HTML 表单,我首先检查电子邮件是否采用 username@host.com 形式,然后如果他们的电子邮件在数据库中,则向他们发送一封电子邮件,其中包含他们的临时地址密码,以便他们可以使用该临时密码登录并重置密码。 但我也不想阻止任何可能试图根据从网站获得的输出获取我网站中所有现有电子邮件列表的机器人,例如"Your password has been reset ..."。

我见过一些这样做的网站:如果您尝试使用错误的地址找回您的密码,那么(我在想)阻止他们的 IP 地址一段特定的时间,比如说 1 小时。我想知道是否有办法用 PHP 或 javascript 来解决这个问题。

如果有任何我能得到的例子来解决这个问题就太好了。

您的数据库中需要 table 来保存数据。

当有人填写表格时,将其记录在 table 中。你需要他们的 IP 和时间。

当他们填写表格时,拉出他们在过去 x 分钟内进行了多少次尝试。如果它们大于 x 次尝试,则阻止该表单。

机器人将使用代理,因此它们可以在几分钟内尝试 1000 个 IP 地址进行 10,000 次尝试。

添加一个好的验证码是关键。那些你必须选择特定图片的地方,机器人真的无法通过。

按照这条路线,您需要设置一个 cron 作业来清除旧日志,这样一百万条记录就不会拖慢您的站点。让它 运行 在午夜,并清除过去 24 小时或您认为最适合您的设置的任何时间范围内的所有旧日志。

注: 这是一个基线设置。您可以在 table 中存储您需要的任何数据。您可以包括他们的用户代理 .. 但在最短的时间内,您需要 IP 地址和他们尝试执行该操作的日期时间。有了这些信息,您可以执行 SQL 查询以查看他们在过去 x 分钟内尝试了多少次。

您也可以使用会话 and/or cookie。但是,用户可以简单地删除 cookie 并摆脱会话,机器人也会获得过去的会话和 cookie。所以实际上,最好的解决方案是将 IP 和时间存储在 table 中,并根据需要进行处理。

如果你不发布一些代码,我真的无法为你写一个代码。我们是来帮忙的,不是帮别人编程的。

我建议在您的注册页面上添加验证码:

参见 - Google ReCaptcha

验证码被广泛使用,尤其是最近新发布的 Google 验证码消除了很多 "annoyance",因为它 - 大多数时候 - 只需要用户选中一个复选框.

对于这种情况,有几种选择。正如一些人所说,您可以添加一个验证码,它不是 100% 万无一失,但它是一个很好的解决方案。

从安全的角度来看,我不会向用户发送临时密码,而是向用户发送 link 到他们可以自行更改密码的页面。您需要生成一个一次性密钥,他们可以在更改密码之前在网站上输入该密钥,或者生成 link 以便它包含一次性密码并让您的应用程序获取它。 此外,无论您采用一次性密码方法,还是向用户发送临时密码,请确保他们必须更改密码的时间超时。您可以在他们在数据库中的记录上设置一个时间戳,并在他们尝试输入 code/change 密码

时进行检查