1. 程式人生 > >PHP token驗證規則

PHP token驗證規則

知識 key 是否 targe ask ring char rep 判斷

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?
  1. <?php
  2. /*
  3. * PHP簡單利用token防止表單重復提交
  4. * 此處理方法純粹是為了給初學者參考
  5. */
  6. session_start();
  7. function set_token() {
  8. $_SESSION[‘token‘] = md5(microtime(true));
  9. }
  10. function valid_token() {
  11. $return = $_REQUEST[‘token‘] === $_SESSION[‘token‘] ? true : false;
  12. set_token();
  13. return $return;
  14. }
  15. //如果token為空則生成一個token
  16. if(!isset($_SESSION[‘token‘]) || $_SESSION[‘token‘]==‘‘) {
  17. set_token();
  18. }
  19. if(isset($_POST[‘test‘])){
  20. if(!valid_token()){
  21. echo "token error";
  22. }else{
  23. echo ‘成功提交,Value:‘.$_POST[‘test‘];
  24. }
  25. }
  26. ?>
  27. <form method="post" action="">
  28. <input type="hidden" name="token" value="<?php echo $_SESSION[‘token‘]?>">
  29. <input type="text" name="test" value="Default">
  30. <input type="submit" value="提交" />
  31. </form>

PHP token驗證規則