碼迷,mamicode.com
首頁 > Web開發 > 詳細

PHP token驗證規則

時間:2017-07-13 11:33:09      閱讀:566      評論:0      收藏:0      [點我收藏+]

標簽: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攻擊。
  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驗證規則

標簽:iss   ova   mic   class   keyword   x11   views   相對   span   

原文地址:http://www.cnblogs.com/wqwpy123/p/7159508.html

(0)
(0)
   
舉報
評論 一句話評論(0
登錄后才能評論!
? 2014 mamicode.com 版權所有 京ICP備13008772號-2
迷上了代碼!
公式规律下期单双