PHP利用session與cookies防重複提交執行個體_PHP教程

來源:互聯網
上載者:User
在網頁開發中防止重複提交是一個比較實用並且也常用碰到的問題了,除了我們可以直接在資料庫查詢使用者是否提交相同資料進行過濾外,我們還可以在使用者提交資料時就防止這類事情發現,下面我來介紹基於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在網頁開發中防止重複提交是一個比較實用並且也常用碰到的問題了,除了我們可以直接在資料庫查詢使用者是否提交相同資料進行過濾外,...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.