Javascript 如果用户在粘贴7分钟内已经单击了“提交”按钮,则禁止用户单击该按钮

Javascript 如果用户在粘贴7分钟内已经单击了“提交”按钮,则禁止用户单击该按钮,javascript,php,jquery,html,forms,Javascript,Php,Jquery,Html,Forms,我想禁用“提交”按钮7分钟,我想在表单旁边显示一条文字:“提交前等待7分钟”。当倒计时结束时,我想要一条短信,上面写着“你现在可以提交了” 提交 安全地执行此操作的唯一方法是服务器端验证。这意味着服务器必须存储用户上次单击提交按钮时的某个位置(最好是数据库)。这也意味着您需要一个用户帐户系统 显然,您可以在提交成功时更新上次单击的时间。如果失败,您可以返回剩余的分钟数,并让JavaScript从中创建倒计时计时器。然而,计时器应该只是为了方便。是否经过了足够的时间的实际验证应该完全是服务器端的

我想禁用“提交”按钮7分钟,我想在表单旁边显示一条文字:“提交前等待7分钟”。当倒计时结束时,我想要一条短信,上面写着“你现在可以提交了”


提交

安全地执行此操作的唯一方法是服务器端验证。这意味着服务器必须存储用户上次单击提交按钮时的某个位置(最好是数据库)。这也意味着您需要一个用户帐户系统

显然,您可以在提交成功时更新上次单击的时间。如果失败,您可以返回剩余的分钟数,并让JavaScript从中创建倒计时计时器。然而,计时器应该只是为了方便。是否经过了足够的时间的实际验证应该完全是服务器端的


从技术上讲,您可以在JS中实现这一点,使用cookies跟踪用户,但这很容易做到(删除cookie或修改页面的源代码)。在JS中不应该这样做。

我在另一个答案的评论中看到,您使用的是PHP,而不是数据库。如果这就是你想要使用的全部,那么你可以采用这种方法

(1) 当用户单击按钮并提交表单时,您需要设置一个保存当前时间的PHP会话变量。因此,如果用户提交表单说
doSomething.php
,那么在那里处理表单数据集
$\u SESSION['formSubmitTime']=microtime(true)

(2) 然后返回包含您阅读的表单的页面
$\u SESSION['formSubmitTime']
,并将其与当前时间进行比较。如果时间超过7分钟,请打开按钮

$time_end = microtime(true);
$secondsElapsed = $time_end - $_SESSION['formSubmitTime'];

echo "Form submitted $secondsElapsed seconds ago\n";
如果
$secondsElapsed
大于420,则显示该按钮,否则禁用该按钮

(3) 这会让你到达你想去的地方。但是你可以更进一步,不需要他们刷新页面。要做到这一点,您必须执行上面的代码,然后根据已经经过的秒数设置一个JavaScript倒计时,从正确的数字开始。因此,假设上面的
$secondsElapsed
是100秒。然后,您将拥有JavaScript代码,该代码将在320秒(420秒=7分钟)(剩余420-100秒=320秒)后执行
setTimeout
。所以看起来像这样
setTimeout(函数(){/*将按钮重新打开的代码*/},320000)

更新--感谢您发布表单代码。下面是一个更完整的示例。(这是很快免费输入的,所以可能会有一些打字错误,但应该足够让你指出正确的方向。)希望这有帮助

<script>
    function allowSubmit(){
        //change the text
        $("#msgText").text('You can submit the form again.');
        //enable the button
        $("#submit_btn").removeAttr('disabled');
    }
</script>

<?php
//If $_SESSION['formSubmitTime'] is not defined then that means they have never submitted.  So they don't have to wait
if (!isset($_SESSION['formSubmitTime']))
{
    $secondsToWait = 0;
}
else
{
    $time_end = microtime(true);
    $secondsElapsed = $time_end - $_SESSION['formSubmitTime'];  //remember to set this back on the page you post to
    $secondsToWait = 420-$secondsElapsed;
}

echo'
<form action="" method="post" name="myform" id="myform" onsubmit="return formSubmit(this);" class="form-wrapper cf">
    <input name="statusid" autocomplete="off" id="statusid" placeholder="Enter ID" required="" type="text">
    <button name="submit_btn" class="submit" id="submit_btn" type="submit" '.$secondsToWait > 0?"disabled":"".'>Submit</button>
</form>';

if ($secondsToWait > 0)
{
    echo'<span id="msgText">You must wait '.$secondsToWait.' seconds.</span>
    <script>setTimeout(function(){ allowSubmit() },'.$secondsToWait.'000);</script>';
}
else
    echo'<span id="msgText">You can submit the form again.</span>';
?>

函数allowSubmit(){
//更改文本
$(“#msgText”).text('您可以再次提交表单');
//启用按钮
$(“提交”).removeAttr('disabled');
}

即使这个问题没有任何说明,我想我可能会得到一些提示来帮助其他人。我将此称为事件锁定问题:)

首先,未经适当授权(关闭注册或facebook gmail等)。它永远不会真正安全。问题是你能做些什么来让它更难突破

最容易做和最容易违反的就是js脚本。使用
jQuery('button').prop('disable',true)
(来自jQuery库)禁用按钮7分钟,然后添加
setTimeout(function(){jQuery('button').prop('disable',false)}
就可以了。然而,要打破这一点,你只需要js控制台,甚至firebug。以更好的方式,您还可以在禁用按钮时添加cookie,并在启用按钮时进行检查。不过,console和firebug将再次获胜

我们可以添加的另一个安全性已经使用了后端技术

1.我们通过创建文件或数据库记录开始倒计时(我强烈建议使用数据库,但有时您没有或只是不在其他任何地方使用数据库),包括两件事:从现在起调用的唯一键id(每次都不同,例如
自动增量
)和时间戳(如果我们有多个按钮或事件,我们也可以使用事件/按钮id)。然后我们将此唯一id作为cookie发送到用户浏览器(如果我们有多个事件,我们将发送对id和按钮/事件id)。 2.在前端,我们创建了第一种情况下添加的脚本。用户单击按钮后,后端脚本检查cookie中的id的时间戳是否早于7分钟,如果是,它将传递文件。如果不是,则返回错误或任何您想要的内容。我们还可以添加ajax,以每30分钟检查一次,例如,如果有人例如,我会关闭浏览器或其他我们可以随时向他们显示剩余的适当时间。时间越长(越难)您将使用唯一id,脚本越强大,因为尝试使用不同用户使用的某些id就越困难。如果使用前面提到的
AUTO_INCREMENT
,您可以将此id散列到一些复杂的字符串中

此解决方案将阻止90%的垃圾邮件发送者。但主要是因为90%的垃圾邮件发送者对编码一无所知。实际上,在编写机器人程序时,处理cookies从来没有这么容易

另一种方法是添加到记录中(仅DB选项)用户的IP。在这种情况下,他们将无法捕获其他人的cookie,因为他们还必须捕获他们的IP,这已经非常困难。这也将删除这些可以等待7分钟但不想再等待几分钟下载的人。例如,启动计数器1000次,而不是获得100次7分钟后0个结果(这将花费他们7000分钟)。对于同一ip上的每个人只发出一个请求就足够了。但是这有一些缺点。如果两个人使用同一个wi会发生什么情况
<script>
    function allowSubmit(){
        //change the text
        $("#msgText").text('You can submit the form again.');
        //enable the button
        $("#submit_btn").removeAttr('disabled');
    }
</script>

<?php
//If $_SESSION['formSubmitTime'] is not defined then that means they have never submitted.  So they don't have to wait
if (!isset($_SESSION['formSubmitTime']))
{
    $secondsToWait = 0;
}
else
{
    $time_end = microtime(true);
    $secondsElapsed = $time_end - $_SESSION['formSubmitTime'];  //remember to set this back on the page you post to
    $secondsToWait = 420-$secondsElapsed;
}

echo'
<form action="" method="post" name="myform" id="myform" onsubmit="return formSubmit(this);" class="form-wrapper cf">
    <input name="statusid" autocomplete="off" id="statusid" placeholder="Enter ID" required="" type="text">
    <button name="submit_btn" class="submit" id="submit_btn" type="submit" '.$secondsToWait > 0?"disabled":"".'>Submit</button>
</form>';

if ($secondsToWait > 0)
{
    echo'<span id="msgText">You must wait '.$secondsToWait.' seconds.</span>
    <script>setTimeout(function(){ allowSubmit() },'.$secondsToWait.'000);</script>';
}
else
    echo'<span id="msgText">You can submit the form again.</span>';
?>