首頁  >  文章  >  後端開發  >  php中使用Session令牌防止Ajax表單重複提交

php中使用Session令牌防止Ajax表單重複提交

伊谢尔伦
伊谢尔伦原創
2016-12-01 11:30:172081瀏覽

防止表單重複提交主要有兩種方式:

1) 透過重定向(非Ajax表單提交)

2) 透過Session Token(Session令牌)

當客戶端請求頁面時,伺服器會產生隨機數,並且將該隨機數放置到session當中,然後將該隨機數發送給客戶端;如果客戶第一次提交,那麼會將該隨機數發送到伺服器端,伺服器會接收到該隨機數並且與session中所保存的隨機數進行比較,這時兩者的值是相同的,伺服器認為是第一次提交,並且將更新伺服器端的這個隨機數值;如果此時再次重複提交,那麼客戶端發給伺服器端的隨機數還是之前的那個,而伺服器端的隨機數已經發生了變化,兩者不同,伺服器就認為這是重複提交。

產生一個隨機數字並使用md5進行加密:

$_token = md5(microtime()+rand(1,10000));
$_SESSION['_token'] = $_token;

將該數值發送到客戶端,作為表單隱藏欄位提交:

<input type="hidden" value="<?php echo $_token;?>" name="_token"/>

然後在提交的時候將提交過來的資料和伺服器Session中的資料進行對比,如果為空或不相等,則都認為是非法操作:

if(!isset($_POST(&#39;_token&#39;))){
    echo json_encode(array(&#39;status&#39;=>&#39;failed&#39;,&#39;msg&#39;=>&#39;非法操作!&#39;));
    exit();
}
if(isset($_POST[&#39;_token&#39;]) && $_POST[&#39;_token&#39;]!=$_SESSION[&#39;_token&#39;]){
    echo json_encode(array(&#39;status&#39;=>&#39;failed&#39;,&#39;msg&#39;=>&#39;表单只能提交一次,不能重复提交!&#39;));
    exit();
}


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn