中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

php表單加入Token如何防止重復提交

發布時間:2021-08-30 15:50:20 來源:億速云 閱讀:187 作者:小新 欄目:開發技術

這篇文章主要介紹php表單加入Token如何防止重復提交,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

具體如下:

Token淺談

Token,就是令牌,最大的特點就是隨機性,不可預測。一般黑客或軟件無法猜測出來。

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

Token一般用在兩個地方——防止表單重復提交、anti csrf攻擊(跨站點請求偽造)。

兩者在原理上都是通過session token來實現的。當客戶端請求頁面時,服務器會生成一個隨機數Token,并且將Token放置到session當中,然后將Token發給客戶端(一般通過構造hidden表單)。下次客戶端提交請求時,Token會隨著表單一起提交到服務器端。

然后,如果應用于“anti csrf攻擊”,則服務器端會對Token值進行驗證,判斷是否和session中的Token值相等,若相等,則可以證明請求有效,不是偽造的。

不過,如果應用于“防止表單重復提交”,服務器端第一次驗證相同過后,會將澀session中的Token值更新下,若用戶重復提交,第二次的驗證判斷將失敗,因為用戶提交的表單中的Token沒變,但服務器端session中Token已經改變了。

上面的session應用相對安全,但也叫繁瑣,同時當多頁面多請求時,必須采用多Token同時生成的方法,這樣占用更多資源,執行效率會降低。因此,也可用cookie存儲驗證信息的方法來代替session Token。比如,應對“重復提交”時,當第一次提交后便把已經提交的信息寫到cookie中,當第二次提交時,由于cookie已經有提交記錄,因此第二次提交會失敗。

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

php表單加入Token如何防止重復提交

所以,安全和高效相對的。具體問題具體對待吧。

php表單加入Token防止重復提交

原理在于生成一個隨機字符串放在session里,提交表單后來驗證這個字符串,可以做到防止他人自己寫form來欺騙提交,重復提交或者雙擊提交。

php表單加入Token如何防止重復提交

簡單的用php實現的代碼如下:

<?php
/*
* PHP簡單利用token防止表單重復提交
* 此處理方法純粹是為了給初學者參考
*/
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為空則生成一個token
if(!isset($_SESSION['token']) || $_SESSION['token']=='') {
  set_token();
}
if(isset($_POST['test'])){
  if(!valid_token()){
    echo "token error";
  }else{
    echo '成功提交,Value:'.$_POST['test'];
  }
}
?>
<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>

上面的比較簡單一點的方法,下面的代碼更加安全一點。

Token.php

<?php
/*
 * Created on 2013-3-25
 *
 * To change the template for this generated file go to
 * Window - Preferences - PHPeclipse - PHP - Code Templates
 */
function getToken($len = 32, $md5 = true) {
  # Seed random number generator
  # Only needed for PHP versions prior to 4.2
  mt_srand((double) microtime() * 1000000);
  # Array of characters, adjust as desired
  $chars = array (
    'Q',
    '@',
    '8',
    'y',
    '%',
    '^',
    '5',
    'Z',
    '(',
    'G',
    '_',
    'O',
    '`',
    'S',
    '-',
    'N',
    '<',
    'D',
    '{',
    '}',
    '[',
    ']',
    'h',
    ';',
    'W',
    '.',
    '/',
    '|',
    ':',
    '1',
    'E',
    'L',
    '4',
    '&',
    '6',
    '7',
    '#',
    '9',
    'a',
    'A',
    'b',
    'B',
    '~',
    'C',
    'd',
    '>',
    'e',
    '2',
    'f',
    'P',
    'g',
    ')',
    '?',
    'H',
    'i',
    'X',
    'U',
    'J',
    'k',
    'r',
    'l',
    '3',
    't',
    'M',
    'n',
    '=',
    'o',
    '+',
    'p',
    'F',
    'q',
    '!',
    'K',
    'R',
    's',
    'c',
    'm',
    'T',
    'v',
    'j',
    'u',
    'V',
    'w',
    ',',
    'x',
    'I',
    '$',
    'Y',
    'z',
    '*'
  );
  # Array indice friendly number of chars;
  $numChars = count($chars) - 1;
  $token = '';
  # Create random token at the specified length
  for ($i = 0; $i < $len; $i++)
    $token .= $chars[mt_rand(0, $numChars)];
  # Should token be run through md5?
  if ($md5) {
    # Number of 32 char chunks
    $chunks = ceil(strlen($token) / 32);
    $md5token = '';
    # Run each chunk through md5
    for ($i = 1; $i <= $chunks; $i++)
      $md5token .= md5(substr($token, $i * 32 - 32, 32));
    # Trim the token
    $token = substr($md5token, 0, $len);
  }
  return $token;
}
?>

form.php

<?php
include_once("token.php");
$token = getToken();
session_start();
$_SESSION['token'] = $token;
?>
<form action="action.php" method="post"
<input type="hidden" name="token" value="<?=$token?>" />
<!-- 其他input submit之類的 -->
</form>

action.php

<?php
session_start();
if($_POST['token'] == $_SESSION['token']){
  unset($_SESSION['token']);
  echo "這是一個正常的提交請求";
}else{
  echo "這是一個非法的提交請求";
}
?>

以上是“php表單加入Token如何防止重復提交”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

石嘴山市| 陵川县| 磐石市| 通海县| 文化| 攀枝花市| 庆云县| 勃利县| 华阴市| 沅陵县| 翁牛特旗| 聂拉木县| 和平县| 拉孜县| 离岛区| 仁怀市| 安福县| 商南县| 郑州市| 凤翔县| 临夏市| 两当县| 台中市| 雅江县| 阳江市| 四会市| 夏邑县| 虎林市| 大同县| 财经| 巫山县| 垦利县| 龙泉市| 新河县| 白银市| 黎平县| 同江市| 措美县| 张家口市| 汉阴县| 康平县|