如何使用php限制用户在10分钟内提交表单不止一次

如何使用php限制用户在10分钟内提交表单不止一次,php,forms,Php,Forms,我想知道,如果用户已经提交表单一次,是否可以创建一个限制,php将不接受表单数据。我的客户想要的系统就像一个开放系统。不需要用户注册,因此我无法使用会话技巧为每个用户设置10分钟的限制,然后他们才能再次提交表单 任何解决方案都将不胜感激。我不想对IP设置限制,因为许多用户使用共享IP。使用会话,您可以限制来自同一浏览器会话的其他表单提交 以下内容不检查“重复”提交,只检查10分钟内的多个提交 如果要检查重复提交,可以在时间戳旁边存储表单数据的散列 <?php session_start()

我想知道,如果用户已经提交表单一次,是否可以创建一个限制,php将不接受表单数据。我的客户想要的系统就像一个开放系统。不需要用户注册,因此我无法使用会话技巧为每个用户设置10分钟的限制,然后他们才能再次提交表单


任何解决方案都将不胜感激。我不想对IP设置限制,因为许多用户使用共享IP。

使用会话,您可以限制来自同一浏览器会话的其他表单提交

以下内容不检查“重复”提交,只检查10分钟内的多个提交

如果要检查重复提交,可以在时间戳旁边存储表单数据的散列

<?php
session_start();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $timestamp = isset($_SESSION['form_submitted_ts'])
        ? $_SESSION['form_submitted_ts'] 
        : null;
    if(is_null($timestamp) || (time() - $timestamp) > 10 * 60) {
        if(process_data($_POST)) {
            $_SESSION['form_submitted_ts'] = time();
            echo 'Success!';
        }
    } else {
        // Form submitted in last 10 minutes.  Perhaps send HTTP 403 header.
        die('Failure! (Form submissions are rate limited.)');
    }
}

function process_data($data)
{
    // Your code here...
    return true;
}

?>
<form method="post">
    <input type="submit" value="submit">
</form>

使用
会话
是解决问题的方法

方法

  • 当用户访问您的页面时,只需启动会话
    session_start()
  • 创建一个会话变量,用于存储当前时间
    $\u会话['user']['login\u time']
  • 将当前时间存储在该变量
    $\u SESSION['time']['login\u time']=currentTime()中
    -->请注意,currentTime()是获取当前时间的函数
  • 然后设置一个条件,如果newtime-currentTime>=10,则检查
  • 如果是真的,那么宾果!提姆,让它继续运行

_我建议使用Javascript,因为它会减少对服务器的影响,并且它在浏览器上运行,而不是在服务器上运行。使用JS也可以很容易地实现这一点。

您可以使用会话、自定义cookie或post/get变量-您需要一种方法来存储他们已经提交的表单,因此这是您的最佳选择

最简单的方法是使用$_SESSION——我假设您启动一个会话并将其作为cookie写入用户(基本上是默认设置)

您可以使用javascript完成此操作,并在提交时编写cookie,您可以在PHP($\u cookie)中进行检查,要停止用户再次提交表单,还可以在页面上的javascript中进行检查

不利的一面是,如果您使用Javascript制作cookie,则有人可以更改内容,但如果他们清除存储$\u会话的cookie,则情况也是如此,除非您在GET和POST请求中传递它


您可以使用表单(GET/POST)上的一个隐藏输入变量来完成此操作,该表单在第一次访问时使用会话id填充,如果您确实不想使用cookie存储会话,则需要查看会话id()。这仍然在使用会话,但没有cookie上的支持。

您可能需要“会话技巧”。使用另一个浏览器或清除cookies很容易规避,但可能99%有效。大约:-)您可以使用php会话而无需用户注册。用户提交表单并处理内容后,可以在会话中输入标志。检查表单处理之前没有设置标志。如果重复是页面刷新的结果,请考虑POST、重定向、获取方法。您可以考虑使用以验证用户是否是人,而如果用户输入了他们稍后想要更改的内容,那么这将是什么?我看到了联系人表单数据,其中用户已经回来,并故意更改了他们的电子邮件地址或其他联系方式。防止额外的帖子实际上可能是一个难点。这基本上解决了问题。但是这个解决方案仍然存在一些弱点,例如如果用户使用不同的浏览器或使用匿名模式,那么就没有办法阻止它。但是,如果用户注册不是强制性的,我想除了这个,真的没有其他好的解决方案。谢谢你。