《PHP教程:php表單加入Token防止重復提交的方法分析》要點:
本文介紹了PHP教程:php表單加入Token防止重復提交的方法分析,希望對您有用。如果有疑問,可以聯系我們。
PHP編程本文實例講述了php表單加入Token防止重復提交的方法.分享給大家供大家參考,具體如下:
PHP編程Token淺談
PHP編程Token,就是令牌,最大的特點就是隨機性,不可預測.一般黑客或軟件無法猜測出來.
PHP編程那么,Token有什么作用?又是什么原理呢?
PHP編程Token一般用在兩個地方――防止表單重復提交、anti csrf攻擊(跨站點請求偽造).
PHP編程兩者在原理上都是通過session token來實現的.當客戶端請求頁面時,服務器會生成一個隨機數Token,并且將Token放置到session當中,然后將Token發給客戶端(一般通過構造hidden表單).下次客戶端提交請求時,Token會隨著表單一起提交到服務器端.
PHP編程然后,如果應用于“anti csrf攻擊”,則服務器端會對Token值進行驗證,判斷是否和session中的Token值相等,若相等,則可以證明請求有效,不是偽造的.
PHP編程不過,如果應用于“防止表單重復提交”,服務器端第一次驗證相同過后,會將澀session中的Token值更新下,若用戶重復提交,第二次的驗證判斷將失敗,因為用戶提交的表單中的Token沒變,但服務器端session中Token已經改變了.
PHP編程上面的session應用相對安全,但也叫繁瑣,同時當多頁面多請求時,必須采用多Token同時生成的方法,這樣占用更多資源,執行效率會降低.因此,也可用cookie存儲驗證信息的方法來代替session Token.比如,應對“重復提交”時,當第一次提交后便把已經提交的信息寫到cookie中,當第二次提交時,由于cookie已經有提交記錄,因此第二次提交會失敗.
PHP編程不過,cookie存儲有個致命弱點,如果cookie被劫持(xss攻擊很容易得到用戶cookie),那么又一次gameover.黑客將直接實現csrf攻擊.
PHP編程
PHP編程所以,安全和高效相對的.具體問題具體對待吧.
PHP編程php表單加入Token防止重復提交
PHP編程原理在于生成一個隨機字符串放在session里,提交表單后來驗證這個字符串,可以做到防止他人自己寫form來欺騙提交,重復提交或者雙擊提交.
PHP編程
PHP編程簡單的用php實現的代碼如下:
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>
PHP編程上面的比較簡單一點的方法,下面的代碼更加安全一點.
PHP編程Token.php
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;
}
?>
PHP編程form.php
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>
PHP編程action.php
PHP編程
<?php
session_start();
if($_POST['token'] == $_SESSION['token']){
unset($_SESSION['token']);
echo "這是一個正常的提交請求";
}else{
echo "這是一個非法的提交請求";
}
?>
PHP編程更多關于PHP相關內容感興趣的讀者可查看本站專題:《php程序設計安全教程》、《php安全過濾技巧總結》、《PHP運算與運算符用法總結》、《PHP網絡編程技巧總結》、《PHP基本語法入門教程》、《php操作office文檔技巧總結(包括word,excel,access,ppt)》、《php面向對象程序設計入門教程》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》
PHP編程希望本文所述對大家PHP程序設計有所幫助.
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/3097.html