每个会话只提交一次php表单

时间:2017-01-10 10:57:54

标签: javascript php jquery forms session

我希望每个会话只启用一次表单提交。我试图禁用提交按钮,但这对点击功能来说对于机器人来说没有任何意义,因此每次会话的额外单个提交层是我认为可以从机器人中节省的一些

OR

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

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

我的代码是

 <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进行表单提交,这样就可以更明智地控制提交功能,以便在不止一次提交点击时弹出弹出窗口....我是对的,如果是的话,那就是这样引导

1 个答案:

答案 0 :(得分:0)

以下是使用会话执行此操作的一种方法。 基本上我正在生成一个令牌并将其存储在会话中,如果它尚未在会话中。我也在表单中包含相同内容,可以交叉检查(在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
  }
?>