>

防止php表单提交刷新自动重复提交,PHP利用sess

- 编辑:正版管家婆马报彩图 -

防止php表单提交刷新自动重复提交,PHP利用sess

防止刷新或再交提交

js 阻止重复提交

所以就考虑增加一个参数来防止这类情况的发生,COOKIE和SESSION可供选择,不过 COOKIE是客户端的,如果人家禁用COOKIE的话,照样可以恶意刷新点击数。还是用SESSION的好,IP+URL参数的MD5值做 SESSION名
实现原理 设置 max_reloadtime =100; //设置页面刷新最长间隔时间
用户第一次打开页面 记录当前的时间保存在 session_start
用户第二次打开页面(判断 session_start是否存在) 用当前时间和 session_start 相减 得到差值 time_passed
当 time_passed < max_reloadtime 表示用户在指定时间内频繁刷新了 警告后直接退出

第一个是将告诉浏览器禁用submit按钮的表单被提交之后,第二个是将更改按钮的文本来给用户一些知道发生了什么。这是代码添加到你的表单标记:onsubmit="document.getElementById('myButton').disabled=true;document.getElementById('myButton').value='Submitting, please wait...';"你的表单标记将类似于: 

 代码如下

或jquery做法

<?php 
    session_start(); 
    $k = $_GET['k']; 
    $t = $_GET['t']; 
    //防刷新时间 
    $allowTime = 1800; 
    $ip = get_client_ip(); 
    $allowT = md5($ip . $k . $t); 
    if (!isset($_SESSION[$allowT])) { 
       $refresh = true; 
       $_SESSION[$allowT] = time(); 
    } elseif (time() - $_SESSION[$allowT] > $allowTime) { 
       $refresh = true; 
       $_SESSION[$allowT] = time(); 
    } else { 
       $refresh = false; 
    } 
    ?>  

$(document).ready(function(){
  $(input:submit).click(){
      setTimeout(function(){obj.disabled=true;},100)
  };
});

防表单重复提交

PHP程序员就是这样实现防止用户多表单提交的;这种方法应用于大多数的浏览器(IE  +,FireFox、Opera、…)。

 代码如下

Session阻止重复提交

 <?php   
    /* 改进版
    PHP防止用户刷新页面(Refresh or Reload),重复提交表单内容。
    由于表单变量的内容由$_POST['name']引用,也许在处理完表单后,直接将$_POST['name']销毁(unset())即可。其实不然。可能由于页面默认对表单内容进行了缓存,所以,即使销毁了$_POST['name'],刷新后,$_POST['name']还是会被赋值,一样有效。  
    可利用Session解决。首先给Session赋个值,比如400,第一次提交成功后改变Session的值,当第二次提交时去检查这个Session 的值,如果不是400,就不再处理表单中的数据。
    可设置Session的有效时间?   
    */ 
    if (isset($_POST['action']) && $_POST['action'] == ’submitted’) {      
         session_start();      
         isset($_SESSION['num']) or die ("no session");      
         if ($_SESSION['num']==400){      
                 print ‘<pre>’;      
                 print_r($_POST);      
                 print ‘<a href="’. $_SERVER['PHP_SELF'] .’">Please try again</a>’;      
                 print ‘</pre>’;      
                 $_SESSION['num']=500;      
         } else {      
                 print ‘<pre>’;      
                 print_r($_POST);      
                 echo "However you have submitted";      
                 print ‘</pre>’;      
         }      
    } else {      
         session_start() or die("session is not started");      
         $_SESSION['num']= 400;       
    ?>     
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">     
    Name: <input type="text" name="personal[name]"><br>     
    Email: <input type="text" name="personal[email]"><br>     
    Beer: <br>     
    <select multiple name="beer[]">     
         <option value="warthog">Warthog</option>     
         <option value="guinness">Guinness</option>     
         <option value="stuttgarter">Stuttgarter Schwabenbr</option>   
    </select><br>     
    <input type="hidden" name="action" value="submitted">     
    <input type="submit" name="submit" value="submit me!">     
    </form>     
    <?php     
    }      
    ?> 

由于表单变量的内容由$_POST[‘name’]引用,也许在处理完表单后,直接将$_POST[‘name’]销毁(unset())即可, 其实不然可能由于页面默认对表单内容进行了缓存,所以,即使销毁了$_POST[‘name’],刷新后,$_POST[‘name’]还是会被赋值,一 样有效。

例,一个基于smarty演示版

可利用Session解决。首先给Session赋个值,比如400,第一次提交成功后改变Session的值,当第二次提交时去检查这个Session的值,如果不是400,就不再处理表单中的数据。 可设置Session的有效时间?

 代码如下

<?php
if (isset($_POST[‘action’]) && $_POST[‘action’] == ’submitted’) {
session_start();
isset($_SESSION[‘num’]) or die (“no session”);
if ($_SESSION[‘num’]==400){

$code = mt_rand(0,1000000);
setcookie('addtips',$code,time()+300);
if(isset($_POST['submit']) ){    
if($_COOKIE['addtips']!= $_POST['code']){            
  echo "请不要刷新本页面或重复提交表单";
exit();
}
}
$smarty->assign('code',$code);

echo ‘<a href=”‘.$_SERVER[PHP_SELF] .'”>Please try again</a>';
$_SESSION[‘num’]=500;
} else {

10./////防止表单重复提交

echo “However you have submitted”;
}
} else {
session_start() or die(“session is not started”);
$_SESSION[‘num’]= 400;
?>
<form action=”<?php echo $_SERVER[‘PHP_SELF’]; ?>” method=”POST”>
Name: <input type=”text” name=”personal[name]”><br>
Email: <input type=”text” name=”personal[email]”><br>
Beer: <br>
<select multiple name=”beer[]”>
<option value=”warthog”>Warthog</option>
<option value=”guinness”>Guinness</option>
<option value=”stuttgarter”>Stuttgarter Schwabenbr</option>
</select><br>
<input type=”hidden” name=”action” value=”submitted”>
<input type=”submit” name=”submit” value=”submit me!”>
</form>
<?php
}
?>

在tpl模板中

cookie阻止重复提交

 

引入cookie机制来解决(这个方法不建议用,原因后面会写到)

 代码如下

提交页面代码如下a.php代码如下:

  1. <input type="hidden" name="code" value="{$code}"/>

<form id="form1" name="form1" method="post" action="b.php">
<p>说明
<input type="text" name="titile" />
</p>
<p>
<input type="submit" name="Submit" value="提交" />
</p>
</form>
<?php
setcookie("onlypost", 't');   //设置cookie,可以带上时间值。像有些论坛防止灌水就可以将你的一些基本信息存放到里面。
?>

/*利用PHP的Session功能,也能避免PHP表单重复提交。Session保存在服务器端,在PHP运行过程中可以改变Session变量,下次访问这个变量时,得到的是新赋的值,所以,可以用一个Session变量记录表单提交的值,如果不匹配,则认为是用户在重复提交
*/

处理页面b.php代码如下:

  session_start();//根据当前SESSION生成随机数  
  $code = mt_rand(0,1000000);  
   $_SESSION['code'] = $code;  
//在表单中隐藏传递:
   < input type="hidden" name="originator" value="< ?=$code?>">

<?php
if($_COOKIE['onlypost'] == 't'){
printr($COOKIE);
//处理提交的内容  如果验证成功则处理
print "ok";
setcookie("onlypost", 'f'); //改变cooike值删除也可以了
}
?>

//在接收页代码如下:

利用header函数跳转

 session_start();  
  if(isset($_POST['originator'])) {  
   if($_POST['originator'] ==
   $_SESSION['code']){  
   // 处理该表单的语句,省略  
  }else{  
   echo ‘请不要刷新本页面或
   重复提交表单!’;  
  }  
  }

一旦用户点击提交按钮,处理完数据后跳到其他页面

if (isset($_POST['submit'])) {
   header('location:success.php');//处理数据后,转向到其他页面
}

利用数据库来添加约束

直接在数据库里添加唯一约束或创建唯一索引,一旦发现用户重复提交了,直接抛出警告或者提示,
或者只处理第一次提交的数据,这是最直接有效的方法,要求前期的数据库设计和架构要考虑周全

本文由关于计算机发布,转载请注明来源:防止php表单提交刷新自动重复提交,PHP利用sess