PHP中使用Session令牌防止Ajax表單重復(fù)提交
防止表單重復(fù)提交主要有兩種方式:
1) 通過重定向(非Ajax表單提交)
2) 通過Session Token(Session令牌)
當(dāng)客戶端請求頁面時,服務(wù)器會生成一個隨機(jī)數(shù),并且將該隨機(jī)數(shù)放置到session當(dāng)中,然后將該隨機(jī)數(shù)發(fā)向客戶端;如果客戶第一次提交,那么會將該隨機(jī)數(shù)發(fā)往服務(wù)器端,服務(wù)器會接收到該隨機(jī)數(shù)并且與session中所保存的隨機(jī)數(shù)進(jìn)行比較,這時兩者的值是相同的,服務(wù)器認(rèn)為是第一次提交,并且將更新服務(wù)器端的這個隨機(jī)數(shù)值;如果此時再次重復(fù)提交,那么客戶端發(fā)向服務(wù)器端的隨機(jī)數(shù)還是之前的那個,而服務(wù)器端的隨機(jī)數(shù)則已經(jīng)發(fā)生了變化,兩者不同,服務(wù)器就認(rèn)為這是重復(fù)提交。
生成一個隨機(jī)數(shù)并使用md5進(jìn)行加密:
$_token = md5(microtime()+rand(1,10000));$_SESSION[’_token’] = $_token;
將該數(shù)值發(fā)送到客戶端,作為表單隱藏字段提交:
<input type='hidden' value='<?php echo $_token;?>' name='_token'/>
然后在提交的時候?qū)⑻峤贿^來的數(shù)據(jù)和服務(wù)器Session中的數(shù)據(jù)進(jìn)行對比,如果為空或不相等,則都認(rèn)為是非法操作:
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’=>’表單只能提交一次,不能重復(fù)提交!’)); exit();}
相關(guān)文章:
1. ASP基礎(chǔ)入門第四篇(腳本變量、函數(shù)、過程和條件語句)2. php使用正則驗(yàn)證密碼字段的復(fù)雜強(qiáng)度原理詳細(xì)講解 原創(chuàng)3. jscript與vbscript 操作XML元素屬性的代碼4. Jsp servlet驗(yàn)證碼工具類分享5. XML在語音合成中的應(yīng)用6. 基于PHP做個圖片防盜鏈7. ASP將數(shù)字轉(zhuǎn)中文數(shù)字(大寫金額)的函數(shù)8. 基于javaweb+jsp實(shí)現(xiàn)企業(yè)車輛管理系統(tǒng)9. Jsp+Servlet實(shí)現(xiàn)文件上傳下載 文件列表展示(二)10. HTML5實(shí)戰(zhàn)與剖析之觸摸事件(touchstart、touchmove和touchend)
