PHP token驗證規則
阿新 • • 發佈:2017-07-13
知識 key 是否 targe ask ring char rep 判斷 PHP表單增加token驗證,防止站外提交/重復提交/雙擊提交
PHP在控制器中怎麽添加token驗證
//獲得token
private
function
getToken(){
$tokenName
= C(
‘TOKEN_NAME‘
,null,
‘__hash__‘
);
$tokenType
= C(
‘TOKEN_TYPE‘
,null,
‘md5‘
);
if
(!isset(
$_SESSION
[
$tokenName
])) {
$_SESSION
[
$tokenName
] =
array
();
}
// 標識當前頁面唯一性
$tokenKey
= md5(
$_SERVER
[
‘REQUEST_URI‘
]);
if
(isset(
$_SESSION
[
$tokenName
][
$tokenKey
])) {
// 相同頁面不重復生成session
$tokenValue
=
$_SESSION
[
$tokenName
][
$tokenKey
];
}
else
{
$tokenValue
=
is_callable
(
$tokenType
) ?
$tokenType
(microtime(true)) : md5(microtime(true));
$_SESSION
[
$tokenName
][
$tokenKey
] =
$tokenValue
;
if
(IS_AJAX && C(
‘TOKEN_RESET‘
,null,true))
header(
$tokenName
.
‘: ‘
.
$tokenKey
.
‘_‘
.
$tokenValue
);
//ajax需要獲得這個header並替換頁面中meta中的token值
}
return
array
(
$tokenName
,
$tokenKey
,
$tokenValue
);
}
PHP表單增加token驗證,防止站外提交/重復提交/雙擊提交
<?php @session_start(); if($_POST) { if ($_POST[‘privatetoken‘] == $_SESSION[‘token‘]) { unset($_SESSION[‘token‘]); echo ‘合法提交‘; } else { echo ‘novalite‘; } } $token=md5(getrandcode()); $_SESSION[‘token‘] = $token; function getrandcode(){ $str =array(1,2,3,4,5,6,7,8,9,‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘f‘,‘g‘,‘h‘); $res=‘‘; for($i=0;$i<4;$i++){ $rand=mt_rand(1,16); $res .=$str[$rand]; } return $res; } ?> <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>form</title> </head> <body> <form action="form.php" method="post"> url:<input type="text" name="urlist" /> <input type="hidden" name="privatetoken" value="<?php echo $token;?>" /> <br /> <input type="submit" value="tijiao" /> </form> </body> </html> ------------------------------------------- 表單被模擬的話 session是不會重新生成的- session
Token,就是令牌,最大的特點就是隨機性,不可預測。一般黑客或軟件無法猜測出來。[php] view plain copy print?
那麽,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
- /*
- * 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 token驗證規則