在網頁開發中防止重復提交是一個比較實用並且也常用碰到的問題了,除了我們可以直接在數據庫查詢用戶是否提交相同數據進行過濾外,我們還可以在用戶提交數據時就防止這類事情發現,下面我來介紹基於session與cookies防重復提交一些基於實現方法。
防止刷新或再交提交
所以就考慮增加一個參數來防止這類情況的發生,COOKIE和SESSION可供選擇,不過 COOKIE是客戶端的,如果人家禁用COOKIE的話,照樣可以惡意刷新點擊數。還是用SESSION的好,IP+URL參數的MD5值做 SESSION名
實現原理 設置 max_reloadtime =100; //設置頁面刷新最長間隔時間
用戶第一次打開頁面 記錄當前的時間保存在 session_start
用戶第二次打開頁面(判斷 session_start是否存在) 用當前時間和 session_start 相減 得到差值 time_passed
當 time_passed < max_reloadtime 表示用戶在指定時間內頻繁刷新了 警告後直接退出
<?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;
}
?>
防表單重復提交
<?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
}
?>
例,一個基於smarty演示版
$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);
10./////防止表單重復提交
在tpl模板中
代碼如下 復制代碼
1. <input type="hidden" name="code" value="{$code}"/>
/*利用PHP的Session功能,也能避免PHP表單重復提交。Session保存在服務器端,在PHP運行過程中可以改變Session變量,下次訪問這個變量時,得到的是新賦的值,所以,可以用一個Session變量記錄表單提交的值,如果不匹配,則認為是用戶在重復提交
*/
session_start();//根據當前SESSION生成隨機數
$code = mt_rand(0,1000000);
$_SESSION['code'] = $code;
//在表單中隱藏傳遞:
< input type="hidden" name="originator" value="< ?=$code?>">
//在接收頁代碼如下:
session_start();
if(isset($_POST['originator'])) {
if($_POST['originator'] ==
$_SESSION['code']){
// 處理該表單的語句,省略
}else{
echo ‘請不要刷新本頁面或
重復提交表單!’;
}
}