PHP中使用Session令牌防止Ajax表單重復(fù)提交
防止表單重復(fù)提交主要有兩種方式:
1) 通過(guò)重定向(非Ajax表單提交)
2) 通過(guò)Session Token(Session令牌)
當(dāng)客戶端請(qǐng)求頁(yè)面時(shí),服務(wù)器會(huì)生成一個(gè)隨機(jī)數(shù),并且將該隨機(jī)數(shù)放置到session當(dāng)中,然后將該隨機(jī)數(shù)發(fā)向客戶端;如果客戶第一次提交,那么會(huì)將該隨機(jī)數(shù)發(fā)往服務(wù)器端,服務(wù)器會(huì)接收到該隨機(jī)數(shù)并且與session中所保存的隨機(jī)數(shù)進(jìn)行比較,這時(shí)兩者的值是相同的,服務(wù)器認(rèn)為是第一次提交,并且將更新服務(wù)器端的這個(gè)隨機(jī)數(shù)值;如果此時(shí)再次重復(fù)提交,那么客戶端發(fā)向服務(wù)器端的隨機(jī)數(shù)還是之前的那個(gè),而服務(wù)器端的隨機(jī)數(shù)則已經(jīng)發(fā)生了變化,兩者不同,服務(wù)器就認(rèn)為這是重復(fù)提交。
生成一個(gè)隨機(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'/>
然后在提交的時(shí)候?qū)⑻峤贿^(guò)來(lái)的數(shù)據(jù)和服務(wù)器Session中的數(shù)據(jù)進(jìn)行對(duì)比,如果為空或不相等,則都認(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. 讓chatgpt將html中的圖片轉(zhuǎn)為base64方法示例2. 用xslt+css讓RSS顯示的跟網(wǎng)頁(yè)一樣漂亮3. 《CSS3實(shí)戰(zhàn)》筆記--漸變?cè)O(shè)計(jì)(一)4. ASP.NET Core自定義中間件的方式詳解5. 移動(dòng)端HTML5實(shí)現(xiàn)拍照功能的兩種方法6. CSS3實(shí)現(xiàn)動(dòng)態(tài)翻牌效果 仿百度貼吧3D翻牌一次動(dòng)畫特效7. 教你JS更簡(jiǎn)單的獲取表單中數(shù)據(jù)(formdata)8. html5手機(jī)觸屏touch事件介紹9. ASP.NET MVC把數(shù)據(jù)庫(kù)中枚舉項(xiàng)的數(shù)字轉(zhuǎn)換成文字10. 測(cè)試模式 - XSL教程 - 5
