最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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)的。當(dāng)客戶端請求頁面時,服務(wù)器會生成一個隨機數(shù)Token,并且將Token放置到session當(dāng)中,然后將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)用相對安全,但也叫繁瑣,同時當(dāng)多頁面多請求時,必須采用多Token同時生成的方法,這樣占用更多資源,執(zhí)行效率會降低。因此,也可用cookie存儲驗證信息的方法來代替session Token。比如,應(yīng)對“重復(fù)提交”時,當(dāng)?shù)谝淮翁峤缓蟊惆岩呀?jīng)提交的信息寫到cookie中,當(dāng)?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)文章

最新評論

华容县| 大方县| 洱源县| 蚌埠市| 北流市| 于都县| 德昌县| 德阳市| 松江区| 姚安县| 竹山县| 且末县| 武宣县| 蒙自县| 香河县| 师宗县| 含山县| 喀喇沁旗| 城口县| 湖州市| 金秀| 彝良县| 南平市| 津南区| 茌平县| 崇明县| 彝良县| 高碑店市| 滨州市| 杨浦区| 德州市| 大化| 金堂县| 宜良县| 木里| 武乡县| 贵阳市| 千阳县| 罗城| 江北区| 嘉禾县|