在網頁開發中防止重複提交是一個比較實用並且也常用碰到的問題了,除了我們可以直接在資料庫查詢使用者是否提交相同資料進行過濾外,我們還可以在使用者提交資料時就防止這類事情發現,下面我來介紹基於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 表示使用者在指定時間內頻繁重新整理了 警告後直接退出
| 代碼如下 |
複製代碼 |
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防止使用者重新整理頁面(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 ‘ ’; print_r($_POST); print ‘Please try again’; print ‘ ’; $_SESSION['num']=500; } else { print ‘’; print_r($_POST); echo "However you have submitted"; print ‘ ’; } } else { session_start() or die("session is not started"); $_SESSION['num']= 400; ?> } ?> |
例,一個基於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. /*利用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 ‘請不要重新整理本頁面或 重複提交表單!’; } }
|
http://www.bkjia.com/PHPjc/633153.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/633153.htmlTechArticle在網頁開發中防止重複提交是一個比較實用並且也常用碰到的問題了,除了我們可以直接在資料庫查詢使用者是否提交相同資料進行過濾外,...