PHP如何防止用戶重復(fù)提交表單
我們提交表單的時(shí)候,不能忽視的一個(gè)限制是防止用戶重復(fù)提交表單,因?yàn)橛锌赡苡脩暨B續(xù)點(diǎn)擊了提交按鈕或者是攻擊者惡意提交數(shù)據(jù),那么我們?cè)谔峤粩?shù)據(jù)后的處理如修改或添加數(shù)據(jù)到數(shù)據(jù)庫(kù)時(shí)就會(huì)惹上麻煩。
那么如何規(guī)避這中重復(fù)提交表單的現(xiàn)象出現(xiàn)呢?我們可以從很多方面入手:
首先從前端做限制。前端JavaScript在按鈕被點(diǎn)擊一次后禁用,即disabled,這個(gè)方法簡(jiǎn)單的防止了多次點(diǎn)擊提交按鈕,但是缺點(diǎn)是如果用戶禁用了javascript腳本則失效。
第二,我們可以在提交后做redirect頁(yè)面重定向,即提交后跳轉(zhuǎn)到新的頁(yè)面,主要避免F5重復(fù)提交,但是也有不足之處。
第三,就是數(shù)據(jù)庫(kù)做唯一索引約束。
第四,就是做session令牌驗(yàn)證。
我們現(xiàn)在來(lái)了解下簡(jiǎn)單的利用session token來(lái)防止表單重復(fù)提交的方法。
我們?cè)诒韱沃屑右粋€(gè)input隱藏域,即type='hidden',其value值用來(lái)保存token值,當(dāng)頁(yè)面刷新的時(shí)候這個(gè)token值會(huì)變化,提交后判斷token值是否正確,如果前臺(tái)提交的token與后臺(tái)不匹配,則認(rèn)為是重復(fù)提交。
代碼如下
< ?php/* * PHP簡(jiǎn)單利用token防止表單重復(fù)提交 */session_start();header('Content-Type: text/html;charset=utf-8');function set_token() { $_SESSION[’token’] = md5(microtime(true));}function valid_token() { $return = $_REQUEST[’token’] === $_SESSION[’token’] ? true: false; set_token(); return $return;}//如果token為空則生成一個(gè)token if(!isset($_SESSION[’token’]) || $_SESSION[’token’]==’’) { set_token(); } if(isset($_POST[’web’])){ if(!valid_token()){ echo 'token error,請(qǐng)不要重復(fù)提交!'; }else{ echo ’成功提交,Value:’.$_POST[’web’]; } }else{ ?> <form method='post' action=''> <input type='hidden' name='token' value='<?php echo $_SESSION[’token’]?>'> <input type='text' name='web' value='www.jb51.net'> <input type='submit' value='提交' /> </form> <?php } ?>
以上是一個(gè)簡(jiǎn)單的防止重復(fù)提交表單的例子。
那么實(shí)際項(xiàng)目開(kāi)發(fā)中,會(huì)對(duì)表單token做更復(fù)雜的處理,即我們說(shuō)的令牌驗(yàn)證??赡芤龅奶幚?有:驗(yàn)證來(lái)源域,即來(lái)路,是否為外部提交;匹配要執(zhí)行的動(dòng)作,是添加、修改or刪除;其次最重要的是構(gòu)建token,token可以采用可逆的加密算法, 盡可能復(fù)雜,因?yàn)槊魑倪€是不安全的。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. XML入門(mén)精解之結(jié)構(gòu)與語(yǔ)法2. idea設(shè)置自動(dòng)導(dǎo)入依賴的方法步驟3. IntelliJ IDEA設(shè)置編碼格式的方法4. ASP基礎(chǔ)入門(mén)第八篇(ASP內(nèi)建對(duì)象Application和Session)5. IntelliJ IDEA設(shè)置條件斷點(diǎn)的方法步驟6. idea重置默認(rèn)配置的方法步驟7. IntelliJ IDEA設(shè)置默認(rèn)瀏覽器的方法8. idea設(shè)置代碼格式化的方法步驟9. PHP腳本的10個(gè)技巧(8)10. idea自定義快捷鍵的方法步驟
