如何限制一个ip每小时只能提交一次表单

How do I limit an ip to be able to submit a form only once every hour

我目前正在从事一个网络项目,我想填写一份反馈表。我希望一个 ip 每次只能以表单形式发送一次反馈,例如4 小时。

如果需要,我可以使用第三方库,但我宁愿不使用它们(jQuery 除外)。

如果您想查看该网站,请访问 this link

我曾尝试研究堆栈溢出和其他网站,但找不到结果。我找不到 JS/jQuery 的方法,主要是 PHP

谢谢

限制用户做某事的速度最适合在服务器上完成。这就是为什么您找到的大多数示例都在 PHP 中。这是因为用户可以轻松地更改他们的机器的功能,因此在服务器上执行此操作更安全。

如果你真的想限制客户端的速率,那么这里是我将如何做的概述:

在本地存储中有一个变量(更多信息请参见 MDN),用于跟踪用户上次提交反馈的时间。

然后,为表单提交事件添加一个事件监听器。在此事件侦听器中,如果自用户上次提交表单后不到 4 小时,则阻止提交表单。您可以使用 ev.preventdefault 执行此操作。另外,记得更新你的变量。

如果您使用的是数据库,则可以使用以下结构。有一个数据库 table(反馈表)和至少 3 列(IP、反馈文本、反馈时间 - 反馈发送时间的时间戳)。

当用户的表单被提交时获取你需要的变量...

$ip=$_POST["ip"];
$feedbackText=$_POST["feedbackText"];

在查询中使用信息...

$qry = "SELECT * FROM feedbackTable WHERE IP=:ip AND feedbackTime BETWEEN DATE_SUB(NOW(), INTERVAL 4 HOURS) AND NOW()";
// or NOW()-4 hours ... depends on database and version

执行查询。如果返回 0 行(对 PHP 中的 PDO 准备语句使用 rowCount()),则可以将反馈文本添加到数据库 and/or,使用户可见。如果返回 1 行,请告诉用户他不能再次提交反馈,直到 4 小时结束。 实际上,在上次提交后的 4 小时内甚至不让用户看到该表单实际上会更好。您可以通过 "polling" 使用 ajax 和 jQuery(在提交后隐藏表单,然后使用 ajax 在数据库查询脚本上设置一个时间间隔 - 也许每分钟一次),当脚本返回时说我们的 4 已经出现,再次显示表格)......但这不是必需的。如果用户花时间填写反馈然后您告诉他们您没有填写反馈是因为时间不够用,他们可能会有点生气。 我不会使用本地存储来节省时间,因为用户可以通过多种方式更改该信息。