PHP中使用Session令牌防止Ajax表單重復提交
防止表單重復提交主要有兩種方式:
1) 通過重定向(非Ajax表單提交)
2) 通過Session Token(Session令牌)
當客戶端請求頁面時,服務器會生成一個隨機數(shù),并且將該隨機數(shù)放置到session當中,然后將該隨機數(shù)發(fā)向客戶端;如果客戶第一次提交,那么會將該隨機數(shù)發(fā)往服務器端,服務器會接收到該隨機數(shù)并且與session中所保存的隨機數(shù)進行比較,這時兩者的值是相同的,服務器認為是第一次提交,并且將更新服務器端的這個隨機數(shù)值;如果此時再次重復提交,那么客戶端發(fā)向服務器端的隨機數(shù)還是之前的那個,而服務器端的隨機數(shù)則已經(jīng)發(fā)生了變化,兩者不同,服務器就認為這是重復提交。
生成一個隨機數(shù)并使用md5進行加密:
$_token = md5(microtime()+rand(1,10000));$_SESSION[’_token’] = $_token;
將該數(shù)值發(fā)送到客戶端,作為表單隱藏字段提交:
<input type='hidden' value='<?php echo $_token;?>' name='_token'/>
然后在提交的時候將提交過來的數(shù)據(jù)和服務器Session中的數(shù)據(jù)進行對比,如果為空或不相等,則都認為是非法操作:
if(!isset($_POST(’_token’))){ echo json_encode(array(’status’=>’failed’,’msg’=>’非法操作!’)); exit();}if(isset($_POST[’_token’]) && $_POST[’_token’]!=$_SESSION[’_token’]){ echo json_encode(array(’status’=>’failed’,’msg’=>’表單只能提交一次,不能重復提交!’)); exit();}
相關文章:
