如何防止用户滥用按钮?

时间:2017-07-15 11:34:26

标签: php

我是PHP的初学者,我试图在按下按钮时制作一些东西来获取xp。你只需要点击它就会给出xp,然后刷新页面以刷新播放器在屏幕上的统计数据。

<form method="post">
<p><input type="submit" value="Kill the mob"  name="add20xp" /></p>
</form>
 <?php

if (isset($_POST['add20xp']))
{
   $add20xp =("UPDATE users SET exp = (exp + 20)"); 
   $execadd20xp = mysqli_query($connection, $add20xp);
   echo '<meta http-equiv="refresh" content="0.1" />';
}

?>

问题是,我想阻止用户粉碎按钮以防止错误和类似的事情......我试图放入睡眠(1)但我可以继续发送垃圾邮件,等待秒,它可以工作所以它是不太有用。 谢谢你的帮助!

3 个答案:

答案 0 :(得分:0)

如果要在提交表单后禁用该按钮3秒,您可以使用:

if(sessionStogare.getItem('submitted') === true){
     document.querySelector('input[type="submit"]').disabled = true;
     setTimeout(function(){
           document.querySelector('input[type="submit"]').disabled = false;
           sessionStorage.removeItem("submitted");
     }, 3000);
}

document.querySelector("body").onclick = function() {
     sessionStorage.setItem("submitted", true);
};

我们将在sessionStorage中注明提交并检查每次加载页面时是否已提交表单。然后,我们将禁用该按钮并在3秒后启用它。

答案 1 :(得分:0)

保存上次在会话状态下完成更新的时间。然后,只允许按下按钮(上次+ 2秒)(选择两秒,因为这是原始问题中的建议间隔)。

ColumnC

正如@Martin在他的评论中所指出的那样,你只想对按下按钮的用户进行更新,这就是评论的含义&#34;修复此行。&#34;

答案 2 :(得分:0)

将您的php页面更改为:

// the beginning of the page:
<?php
// start a SESSION
session_start();
// setup a $_SESSION variable
if (!isset($_SESSION["timestamp"]))
    $_SESSION["timestamp"] = 0;
//
// now put the $_POST part
if (isset($_POST['add20xp'])) {
    // check the time
    $now = time();
    if ($now - $_SESSION["timestamp"] > 2) {
         // more than 2 seconds have passed since last $_POST
         // update the time
         $_SESSION["timestamp"] = time();
         //
         $add20xp =("UPDATE users SET exp = (exp + 20)"); 
         $execadd20xp = mysqli_query($connection, $add20xp);
         //
         echo '<meta http-equiv="refresh" content="0.1" />';
         exit;
    } else {
       // nothing, just let the page load like it is.
    }
}
?>

请注意一些重要的变化:

  • 使用$ _SESSION vars - &gt;存储这些变量并且可以存储 在每个页面加载时检索 - &gt;你可以用它们来存储最后一个 采取行动的时间
  • $ _POST部分应该在开头 页面 - &gt;否则,在您发送表单后,您加载页面 - &gt; 检查帖子 - &gt;然后重新加载......效率不高
  • 如果您将$ _POST部分放在开头,那么您实际上不需要使用meta标记重新加载页面 - &gt;因为数据已经存在 更新