標籤:iss ova mic class keyword x11 views 相對 span
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,就是令牌,最大的特點就是隨機性,不可預測。一般駭客或軟體無法猜測出來。
那麼,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] view plain copy print?
- <?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驗證規則