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

时间:2016-02-22 15:07:21

标签: php forms

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

任何解决方案都将非常感谢。我不想对IP施加限制,因为许多用户使用共享IP。

3 个答案:

答案 0 :(得分:1)

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

以下内容并未检查“重复”字样。提交,在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>

答案 1 :(得分:1)

使用sessions是您问题的解决方案。

方式

  • 当用户访问您的网页时,只需开始会话session_start();
  • 创建一个存储当前时间$_SESSION['user']['login_time'];
  • 的会话变量
  • 将当前时间存储在该变量$_SESSION['time']['login_time'] = currentTime();中 - &GT;请注意,currentTime()是获取当前时间的函数。
  • 然后创建一个检查if newtime - currentTime >= 10
  • 的条件
  • 如果真的那么宾果游戏!其他时间让它继续运行。

_i会建议使用Javascript,因为它会减少服务器上的影响,并且它在浏览器上运行而不是服务器。使用JS也可以实现同样的目的,而且非常容易。

答案 2 :(得分:1)

您可以使用会话,自定义Cookie或发布/获取变量 - 您需要一种方法来存储他们已经提交过表单的内容,因此这些是您最好的选择。

最简单的方法是使用$ _SESSION - 我假设您启动会话并将其作为cookie写入用户(几乎是默认设置)。

您可以使用javascript并在提交时写一个cookie,您可以在PHP($ _COOKIE)中查看,并停止用户再次提交表单,您也可以在页面上的javascript中查看。

如果您使用Javascript制作cookie,则有人可以更改内容,但如果他们清除了存储$ _SESSION的cookie,除非您在GET和POST请求中传递它,否则同样如此。

您可以使用表单上的隐藏输入变量(GET / POST)来执行此操作,首次访问时会使用会话ID填充,如果您真的不想使用Cookie来存储会话,那么需要查看session_id()。这仍然是使用会话,但没有对cookie的依赖。