欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

php表單加入Token防止重復(fù)提交的方法分析

 更新時間:2016年10月10日 15:07:35   作者:kp12345  
這篇文章主要介紹了php表單加入Token防止重復(fù)提交的方法,結(jié)合實例形式分析了Token防止重復(fù)提交的原理與使用技巧,需要的朋友可以參考下

本文實例講述了php表單加入Token防止重復(fù)提交的方法。分享給大家供大家參考,具體如下:

Token淺談

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

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

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

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

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

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

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

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

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

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

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

簡單的用php實現(xiàn)的代碼如下:

<?php
/*
* PHP簡單利用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為空則生成一個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 "這是一個非法的提交請求";
}
?>

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php程序設(shè)計安全教程》、《php安全過濾技巧總結(jié)》、《PHP運算與運算符用法總結(jié)》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》、《PHP基本語法入門教程》、《php操作office文檔技巧總結(jié)(包括word,excel,access,ppt)》、《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總

希望本文所述對大家PHP程序設(shè)計有所幫助。

相關(guān)文章

  • PHP策略模式定義與用法示例

    PHP策略模式定義與用法示例

    這篇文章主要介紹了PHP策略模式定義與用法,結(jié)合實例形式簡單分析了php策略模式的原理、實現(xiàn)與使用方法,需要的朋友可以參考下
    2017-07-07
  • 詳談symfony window下的安裝 安裝時候出現(xiàn)的問題以及解決方法

    詳談symfony window下的安裝 安裝時候出現(xiàn)的問題以及解決方法

    下面小編就為大家?guī)硪黄斦剆ymfony window下的安裝 安裝時候出現(xiàn)的問題以及解決方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • PHP設(shè)計模式之模板方法模式定義與用法詳解

    PHP設(shè)計模式之模板方法模式定義與用法詳解

    這篇文章主要介紹了PHP設(shè)計模式之模板方法模式,結(jié)合實例形式詳細分析了php設(shè)計模式中模板方法模式的概念、原理、定義、用法及相關(guān)注意事項,需要的朋友可以參考下
    2018-04-04
  • PHP 文件上傳全攻略

    PHP 文件上傳全攻略

    PHP文件上傳功能一般都是大家使用事先封裝好的函數(shù),要用的時候直接使用已封裝的函數(shù)就完了,但有時候不能使用封裝函數(shù),還真不大能記住PHP的上傳相關(guān)的東西,在此做個總結(jié),以備后用。
    2010-04-04
  • PHP實現(xiàn)提取多維數(shù)組指定一列的方法總結(jié)

    PHP實現(xiàn)提取多維數(shù)組指定一列的方法總結(jié)

    這篇文章主要介紹了PHP實現(xiàn)提取多維數(shù)組指定一列的方法,結(jié)合實例形式總結(jié)分析了PHP針對多維數(shù)組的遍歷、轉(zhuǎn)換、提取等相關(guān)操作技巧,需要的朋友可以參考下
    2019-12-12
  • php隨機取mysql記錄方法小結(jié)

    php隨機取mysql記錄方法小結(jié)

    這篇文章主要介紹了php隨機取mysql記錄方法,實例分析了幾種常見的隨機獲取mysql數(shù)據(jù)的方法,是非常實用的技巧,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-12-12
  • 50個PHP程序性能優(yōu)化的方法

    50個PHP程序性能優(yōu)化的方法

    程序的執(zhí)行效率很重要,低的執(zhí)行效率意味著你需要在服務(wù)器硬件上有更多的投入,但是,最終的結(jié)果會因為你的程序執(zhí)行效率低,連硬件也無法解決。下面幾十個提高程序執(zhí)行效率的小知識就有必要了解了解了。
    2014-06-06
  • Mysql中l(wèi)imit的用法方法詳解與注意事項

    Mysql中l(wèi)imit的用法方法詳解與注意事項

    mysql的數(shù)據(jù)一般都是用limit控制數(shù)量,它的使用方法也是需要注意的。
    2008-04-04
  • ajax 的post方法實例(帶循環(huán))

    ajax 的post方法實例(帶循環(huán))

    在最近的項目中,為了能解決在大數(shù)據(jù)查詢中出現(xiàn)的超時問題,需要將大數(shù)據(jù)拆分成小數(shù)據(jù),然后進行循環(huán)處理。本人經(jīng)驗不足,技術(shù)有限,只能想到用ajax來傳送數(shù)據(jù)。
    2011-07-07
  • PHP實現(xiàn)簡單漢字驗證碼

    PHP實現(xiàn)簡單漢字驗證碼

    大家知道簡單數(shù)字或者字母驗證碼很容易被破解,但是算式驗證碼或者中文漢字驗證碼不容易被破解,所以建議大家在使用驗證碼的時候,盡量用算式驗證碼或者中文漢字驗證碼。
    2015-07-07

最新評論