【问题标题】:php form submission only once per session每个会话只提交一次 php 表单
【发布时间】:2017-05-24 20:14:33
【问题描述】:

我希望每个会话仅启用一次表单提交。我试图禁用提交按钮,但这个点击功能对机器人来说没什么,所以我认为每个会话额外的单次提交层是我认为可以从机器人中节省一些

为每次提交创建令牌,使提交更加安全和独特

哪个更好以及如何实现,因此任何用户(机器人)都不能两次提交相同的表单

我的代码是

 <form role="form" method='post' action='index.php' id='cme'>
    <input type="hidden" name="val" value="<?php echo $val ?>" />
    <fieldset>
        <div class="form-group">
       <center><div class="g-recaptcha" data-sitekey="sitekey"></di</center>
        </div>
        <div class="row">
        <center>
            <input type="submit" name="claim" class="btn btn-lg btn-success btn-block" value="Claim Now" id="claim" onclick="setTimeout(disableFunction, 1);">
         </center>
        </div>
    </fieldset>
 </form>

提交部分

 if(isset($_POST['claim'])) {
$recaptcha = $_POST['g-recaptcha-response'];
if(!empty($recaptcha)) {
    # Use the recaptcha function here
    $resp   =   getGoogleRecaptcha();
    if($resp['success']) {
        header('Location: index.php');
        # Capture value from the form submit
        $bonval =   $_POST['bonval'];
        # Insert normally
        $db->fetchVal("insert into log (`user_id`,`amount`) values (?,?)", array($id, $bonval));

    } 
}
 else { ?>
<div class="overlay"><div class="popup" style="background:red;">
    <h2>Opps</h2>
    <a class="close" href="#">&times;</a><br/>
    <div><center><span class="blink_me">You missed it</span></center></div>
</div></div>
   <?php  }
 } 

现在的问题是表单在弹出窗口中打开,用户不断点击,分数不断增加,因为每次点击会话视图都是 +1

请您指导我解决此问题,以便一键提交

我认为通过 javascript 进行表单提交会更好,因此可以更明智地控制提交功能,以在多次提交单击时终止弹出窗口....我是对的,如果是,请以这种方式指导

【问题讨论】:

  • 你可以使用 session 或 cookie..
  • 您希望安全防范机器人,还是希望用户每次会话只能使用一次表单?这些是不同的东西。
  • 目前我只想要用户限制每个会话提交一个表单,即使他一直点击
  • 您在问题中使用了 SESSION 这个词!这似乎是一个可能的解决方案。在会话中保留一个变量 I already submitted
  • 任何有更好解决方案的人

标签: javascript php jquery forms session


【解决方案1】:

以下是使用会话执行此操作的一种方法。 基本上我正在生成一个令牌并将其存储在会话中,如果它还没有在会话中。我也在表单中包含了相同的内容,可以交叉检查(在index.php 中)以查看它是否与会话变量匹配。

<?php 
if(! isset($_SESSION['cme-token']) ){
  $cme_token = rand(11111, 99999);
  $_SESSION['cme-token'] = $cme_token;
} ?>

<?php if (!isset($_SESSION['cme'])){ ?>
 <form role="form" method='post' action='index.php' id='cme'>
    <input type="hidden" name="token" value="<?php echo $cme_token ?>" />
    <fieldset>
        <div class="form-group">
       <center><div class="g-recaptcha" data-sitekey="sitekey"></di</center>
        </div>
        <div class="row">
        <center>
            <input type="submit" name="claim" class="btn btn-lg btn-success btn-block" value="Claim Now" id="claim">
         </center>
        </div>
    </fieldset>
 </form>
<? } else {
  <div>ALREADY CLAIMED!</div>
}?>

在 index.php 中,您可以进行额外检查,以确保令牌没有被用户修改,如下所示。

// INDEX.PHP
<?php
  if($_POST['token'] == $_SESSION['cme-token']) {
    //PROCESS THE FORM
  } else {
    // IGNORE THE FORM SUBMIT AS IT DOESN'T CARRY PROPER TOKEN
  }
?>

【讨论】:

  • 我们可以用令牌的方式吗?通过在表单中​​创建一个唯一的令牌隐藏值,然后检查令牌提交是否与会话令牌相同?
  • @john 立即查看答案。
  • @Rao 我已经添加了表单的提交部分,你能看看这个问题,所以我可以正确停止多个提交,因为你可以看到我有 onclick 功能,但用户以某种方式绕过或禁用了 javascript 部分和继续点击....谢谢您的回复
  • 表单提交成功后如何取消设置或重置令牌值?
猜你喜欢
  • 2015-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
相关资源
最近更新 更多