溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

php表單如何加入Token防止重復(fù)提交

發(fā)布時(shí)間:2020-04-07 10:31:45 來源:億速云 閱讀:93 作者:小新 欄目:編程語言

今天小編給大家分享的是php表單如何加入Token防止重復(fù)提交,很多人都不太了解,今天小編為了讓大家更加了解php表單如何加入Token防止重復(fù)提交,所以給大家總結(jié)了以下內(nèi)容,一起往下看吧。一定會(huì)有所收獲的哦。

Token淺談

Token,就是令牌,最大的特點(diǎn)就是隨機(jī)性,不可預(yù)測(cè)。一般黑客或軟件無法猜測(cè)出來。

那么,Token有什么作用?又是什么原理呢?

Token一般用在兩個(gè)地方——防止表單重復(fù)提交、anti csrf攻擊(跨站點(diǎn)請(qǐng)求偽造)。

兩者在原理上都是通過session token來實(shí)現(xiàn)的。當(dāng)客戶端請(qǐng)求頁面時(shí),服務(wù)器會(huì)生成一個(gè)隨機(jī)數(shù)Token,并且將Token放置到session當(dāng)中,然后將Token發(fā)給客戶端(一般通過構(gòu)造hidden表單)。下次客戶端提交請(qǐng)求時(shí),Token會(huì)隨著表單一起提交到服務(wù)器端。

然后,如果應(yīng)用于“anti csrf攻擊”,則服務(wù)器端會(huì)對(duì)Token值進(jìn)行驗(yàn)證,判斷是否和session中的Token值相等,若相等,則可以證明請(qǐng)求有效,不是偽造的。

不過,如果應(yīng)用于“防止表單重復(fù)提交”,服務(wù)器端第一次驗(yàn)證相同過后,會(huì)將澀session中的Token值更新下,若用戶重復(fù)提交,第二次的驗(yàn)證判斷將失敗,因?yàn)橛脩籼峤坏谋韱沃械腡oken沒變,但服務(wù)器端session中Token已經(jīng)改變了。

上面的session應(yīng)用相對(duì)安全,但也叫繁瑣,同時(shí)當(dāng)多頁面多請(qǐng)求時(shí),必須采用多Token同時(shí)生成的方法,這樣占用更多資源,執(zhí)行效率會(huì)降低。因此,也可用cookie存儲(chǔ)驗(yàn)證信息的方法來代替session Token。比如,應(yīng)對(duì)“重復(fù)提交”時(shí),當(dāng)?shù)谝淮翁峤缓蟊惆岩呀?jīng)提交的信息寫到cookie中,當(dāng)?shù)诙翁峤粫r(shí),由于cookie已經(jīng)有提交記錄,因此第二次提交會(huì)失敗。

不過,cookie存儲(chǔ)有個(gè)致命弱點(diǎn),如果cookie被劫持(xss攻擊很容易得到用戶cookie),那么又一次gameover。黑客將直接實(shí)現(xiàn)csrf攻擊。

<?php
/*
* PHP簡(jiǎn)單利用token防止表單重復(fù)提交
* 此處理方法純粹是為了給初學(xué)者參考
*/
session_start();
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['test'])){
  if(!valid_token()){
    echo "token error";
  }else{
    echo '成功提交,Value:'.$_POST['test'];
    echo "<br/>";
    echo "token:".$_SESSION['token'];
  }
}
?>
<form method="post" action="">
  <input type="hidden" name="token" value="<?php echo $_SESSION['token']?>">
  <input type="text" name="test" value="Default">
  <input type="submit" value="提交" />
</form>

以上就是php表單如何加入Token防止重復(fù)提交的簡(jiǎn)略介紹,當(dāng)然詳細(xì)使用上面的不同還得要大家自己使用過才領(lǐng)會(huì)。如果想了解更多,歡迎關(guān)注億速云行業(yè)資訊頻道哦!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI