阻止用户多次填写表单

时间:2014-08-10 22:37:03

标签: html

我用一些输入框和一个按钮实现了一个简单的html表单。用户单击该按钮后,该值将立即发送到服务器并存储在MySQL-DB中。如果重要的话,我使用html客户端和php服务器端。 [编辑:此外,用户点击"提交"按钮。我打算创建一个匿名调查。]

我的问题:如何阻止用户多次填写表单?

非常感谢,

enne

6 个答案:

答案 0 :(得分:1)

首先,您是否只是想阻止用户点击提交按钮两次?一个简单的javascript就可以在点击它时立即禁用该按钮:

document.getElementById('myButton').disabled = true;

或者您是否试图阻止用户稍后返回并再次填写表单?在这种情况下,如果用户经过身份验证,那么这很容易,因为我确定您知道 - 只需在每次提交时存储用户ID,并确保用户在接受之前尚未在数据库中提交一个新的。

但是,如果用户未经过身份验证,则没有100%有效的方法来阻止多次提交。正如NCoder所提到的,您可以检查IP地址的唯一性,但在两种情况下会失败:

  1. 对于NAT后面的所有用户,因此共享相同的IP,只有其中一个能够提交您的表单。确实会阻止第一个用户重新提交,但它也会阻止同一NAT上的所有后续用户使用您的表单完全。可能存在缓解措施 - 例如,允许来自同一IP的x次提交,其中x是足以应对NATed用户的数字,但是足够低以防止您的结果偏离确定的结果太远攻击者。
  2. 对于拥有动态IP地址的用户,此方法在IP地址更改后无效。
  3. 另一种选择是在提交表单后在用户的计算机上存储cookie,但用户可以通过清除cookie和/或使用其他浏览器来解决这个问题。

    根据您的具体情况 - 例如,如果表单收集的数据不重要,并且您只是想阻止偶然的重新提交 - 那么上述任何一种方法都可以起作用(为了简单起见,我会赞成使用Cookie)。 / p>

    但是,对您的问题唯一简单的解决方案是仅允许经过身份验证的用户提交您的表单。

答案 1 :(得分:0)

我建议在服务器端实现一些东西。一种简单的方法是将表单包装在条件语句中,以检查用户是否已提交表单。但如果没有更具体的细节,我将无法为您提供更多帮助。

答案 2 :(得分:0)

您可以做的最好的事情是在使用IP地址的数据库中记录成功提交。

然后你可以每天,每周,任何或从不清除它。

然后,您就可以预防甚至隐藏他们已经完成的表单。

由于您已经在使用数据库,因此只需在数据库中为IP_Address创建一个字段。

然后这样做:

<?

$IP_ADDRESS = $_SERVER['REMOTE_ADDR'];

//where you're inserting your record, just check to see if a record already 
//exists in the database with that IP Address

?>

答案 3 :(得分:0)

另一种选择是检查电子邮件地址是否已存档。

使用此选项,您可能希望进行电子邮件验证,点击其在电子邮件中验证其帐户是否有效。

因此,您将存储所有提交内容,但要求通过电子邮件地址进行验证,每个电子邮件地址的限制为1条记录。

答案 4 :(得分:0)

没有足够的信息来回答这个问题,但无论如何我都会尝试。

如果提交此表单的用户已登录(最佳情况)
提交表单时,连同表单数据一起添加一个数据库字段,指定特定用户已提交表单。

所需要的只是一个整数1(默认值)=尚未提交表格,2 =已经提交了表格。

每次处理表单时,请为用户选择该字段,您将立即知道。此方法的另一个优点是您可以应用将来需要的任何其他条件。

如果提交此表单的用户未登录
你在这里几乎没有选择。最好的可能是创建一个cookie,他们已经提交了表单然后执行if (isset($_COOKIE['form'])) { echo "You've already submitted the form, sucks to be you." }

答案 5 :(得分:0)

我遇到了这个问题,我所做的只是添加了这几行代码

<?php
session_start();

if(isset($_POST['submit']))
{
    if(isset($_SESSION['form_submitted']))
    {
        die('You have already submitted the form.');
    }
    else
    {
        #submitted form code here
        $_SESSION['form_submitted'] = TRUE;
    }
}

?>
相关问题