国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > PHP > 正文

yii2 csrf驗證理分析

2020-03-22 20:12:51
字體:
供稿:網(wǎng)友
  • 知識補充

    因為yii2 csrf的驗證的加解密 涉及到異或運算

    所以需要先補充php里字符串異或運算的相關(guān)知識,不需要的可以跳過

    ^異或運算
    不一樣返回1 否者返回 0
    在PHP語言中,經(jīng)常用來做加密的運算,解密也直接用^就行
    字符串運算時 利用字符的ascii碼轉(zhuǎn)換為2進制來運算
    單個字符運算
    舉例的ascii見下表

    字符

    二進制

    ASCII

    a

    1100001

    97

    b

    1100010

    98

    c

    1100011

    99

    d

    1100100

    100

    計算結(jié)果

    運算

    二進制

    ASCII

    a^b

    0000 0011

    3

    a^c

    0000 0010

    2

    b^d

    0000 0110

    6

    ab^cd

    0000 0010

    2

    a^cd

    0000 0010

    2

    ab^c

    0000 0010

    2

    1.對于單個字符和單個字符的
    直接計算其結(jié)果即可 比如表里的a^b

    2.對于長度一樣的多個字符串 如表里的ab^cd
    計算a^c對應(yīng)的結(jié)果和和b^d對應(yīng)的結(jié)果 對應(yīng)的字符連接起來

    <?php$str1='ab';$str2='cd';$r= $str1^$str2;var_dump($r);echo '<hr>';for($i=0;$i<strlen($r) ;$i++){    echo ord($r[$i]).'<br>';}?>

    對于不等的
    以短的字符串長度位進行計算

    Yii2的csrf token驗證
    在yii2的接收post請求時
    在如果開啟
    enableCsrfValidation為true
    在/vendor/yiisoft/yii2/web/Controller.php

    <?php   html' target='_blank'>public function beforeAction($action)    {        if (parent::beforeAction($action)) {            if ($this->enableCsrfValidation && Yii::$app->getErrorHandler()->exception === null && !Yii::$app->getRequest()->validateCsrfToken()) {                throw new BadRequestHttpException(Yii::t('yii', 'Unable to verify your data submission.'));            }            return true;        }                return false;    }?>

    會進行validateCsrfToken驗證
    在/vendor/yiisoft/yii2/web/Request.php

    <?phppublic function validateCsrfToken($token = null)    {        $method = $this->getMethod();        // only validate CSRF token on non-'safe' methods http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.1        if (!$this->enableCsrfValidation || in_array($method, ['GET', 'HEAD', 'OPTIONS'], true)) {            return true;        }        $trueToken = $this->loadCsrfToken();        if ($token !== null) {            return $this->validateCsrfTokenInternal($token, $trueToken);        } else {            return $this->validateCsrfTokenInternal($this->getBodyParam($this->csrfParam), $trueToken)                || $this->validateCsrfTokenInternal($this->getCsrfTokenFromHeader(), $trueToken);        }    }?>

    說明在 GET, HEAD, OPTIONS 均不驗證,除了這幾種主要用的也就post了

    說明在我們發(fā)送post請求時必須發(fā)送相關(guān)驗證的字段和值
    下面看CsrfToken產(chǎn)生過程
    在/vendor/yiisoft/yii2/web/Request.php里

    <?phppublic function getCsrfToken($regenerate = false)    {        if ($this->_csrfToken === null || $regenerate) {            if ($regenerate || ($token = $this->loadCsrfToken()) === null) {                $token = $this->generateCsrfToken();            }            // the mask doesn't need to be very random            $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-.';            $mask = substr(str_shuffle(str_repeat($chars, 5)), 0, static::CSRF_MASK_LENGTH);            // The + sign may be decoded as blank space later, which will fail the validation            $this->_csrfToken = str_replace('+', '.', base64_encode($mask . $this->xorTokens($token, $mask)));        }        return $this->_csrfToken;    }?>

    會發(fā)現(xiàn)
    _csrfToken的產(chǎn)生大致如下
    如果開啟了enableCsrfCookie,
    CsrfToken就從cookie里取,否者從session里取(更安全)
    可在
    /vendor/yiisoft/yii2/web/Request.php的下面部位看到

    <?php protected function loadCsrfToken()    {        if ($this->enableCsrfCookie) {            return $this->getCookies()->getValue($this->csrfParam);        } else {            return Yii::$app->getSession()->get($this->csrfParam);        }    }?>

    從loadCsrfToken()里取出的值這里稱token

    在post里發(fā)送的也就是Yii::$app->getRequest()->csrfParam 這里稱csrfToken現(xiàn)在根據(jù)代碼大致說下生成和驗證的主要思路,當(dāng)然自己看代碼更能細(xì)致的了解1.從cookie或者session里取出token ,當(dāng)然cookie或者session里如果沒有就是初始化操作的過程了,這里初始化不是重點2.隨機產(chǎn)生CSRF_MASK_LENGTH(Yii2里默認(rèn)是8位)長度的字符串 mask3.對mask和token進行如下運算str_replace('+', '.', base64_encode($mask . $this->xorTokens($token, $mask)));$this->xorTokens($arg1,$arg2) 是一個先補位異或運算

    傳入$arg1,$arg2
    長度短的要用自身補到長度長的字符串的位置
    見代碼部分
    在/vendor/yiisoft/yii2/web/Request.php 的如下部分

     <?php  private function xorTokens($token1, $token2)    {        $n1 = StringHelper::byteLength($token1);        $n2 = StringHelper::byteLength($token2);        if ($n1 > $n2) {            $token2 = str_pad($token2, $n1, $token2);        } elseif ($n1 < $n2) {            $token1 = str_pad($token1, $n2, $n1 === 0 ? ' ' : $token1);        }        return $token1 ^ $token2;    } ?>

    就是說如果 $arg1比$arg2短,$arg1要用自身補齊 補到和和$arg2一樣的長度
    這里為什么要這樣做?
    因為在php里
    'a'^'bc' 會只算 a^b 而不考慮c了,這里采用了向長度更長的來補
    如果用
    xorTokens來處理 'a'和'bc'
    會先把a用自己填充到和bc一樣的長度后再進行異或運算
    異或運算詳見上文補充

    str_replace('+', '.', base64_encode($mask . $this->xorTokens($token, $mask)));


    計算后即會得出在post請求時要發(fā)送的值 csrfToken

    下面是驗證過程
    1.根據(jù) 表單字段名
    Yii::$app->getRequest()->csrfParam;
    從post里拿到
    csrfToken的值
    從方法 validateCsrfToken里可以看到
    代碼
    在/vendor/yiisoft/yii2/web/Request.php 的如下部分

    <?php public function validateCsrfToken($token = null)    {        $method = $this->getMethod();        // only validate CSRF token on non-'safe' methods http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.1        if (!$this->enableCsrfValidation || in_array($method, ['GET', 'HEAD', 'OPTIONS'], true)) {            return true;        }        $trueToken = $this->loadCsrfToken();        if ($token !== null) {            return $this->validateCsrfTokenInternal($token, $trueToken);        } else {            return $this->validateCsrfTokenInternal($this->getBodyParam($this->csrfParam), $trueToken)                || $this->validateCsrfTokenInternal($this->getCsrfTokenFromHeader(), $trueToken);        }    }?>

    $this->getBodyParam($this->csrfParam)
    可以看出
    解密的目的就是要從
    csrfToken里取出token 然后和會話里的token比較
    見/vendor/yiisoft/yii2/web/Request.php 的如下部分

    <?php private function validateCsrfTokenInternal($token, $trueToken)    {        $token = base64_decode(str_replace('.', '+', $token));        $n = StringHelper::byteLength($token);        if ($n <= static::CSRF_MASK_LENGTH) {            return false;        }        $mask = StringHelper::byteSubstr($token, 0, static::CSRF_MASK_LENGTH);        $token = StringHelper::byteSubstr($token, static::CSRF_MASK_LENGTH, $n - static::CSRF_MASK_LENGTH);        /*          注意此時的$token在加密過程中是xorTokens($trueToken,$mask)的結(jié)果        */        $token = $this->xorTokens($mask, $token);        return $token === $trueToken;    }?>

    加密時用的是
    str_replace('+', '.', base64_encode($mask . $this->xorTokens($token, $mask)));
    解密
    1.首先要把.替換成+
    2.然后base64_decode
    再 根據(jù)長度分別取出$mask和$this->xorTokens($token, $mask) ;
    為了說明方便 $this->xorTokens($token, $mask) 這里稱作 token1
    然后
    進行mask和token1的異或運算,即得token
    注意在加密時
    token1=token^mask
    所以
    解密時
    token=mask^token1=mask^(token^mask)

    yii2
    中的核心思路
    token是從會話中取得的
    用隨機串和token進行運算處理 得到一個加密串
    驗證的時候通過這個加密串解密出來這個token和會話里的值進行比較

    PHP編程

    鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

  • 發(fā)表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發(fā)表
    国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
    精灵使的剑舞无删减版在线观看| 在线亚洲电影| 国产网站av| 高清欧美精品xxxxx在线看 | 在线观看精品一区二区三区| 国产精品秘入口| 18成年在线观看| 国产精品白浆视频免费观看| 91在线视频免费看| 超碰在线中文| 九九99九九精彩| 丁香六月婷婷| 精品国产一区二区三区四区阿崩| 在线色视频观看| 欧美色欧美亚洲另类二区精品| 男人天堂网在线观看| 国产美女性感在线观看懂色av| 国产色a在线| 精品国产二区三区| 国产在线小视频| 91激情在线| 国产乱子视频| 亚洲wwwwww| 国产高清在线| 九九热视频在线| 国产日韩欧美精品一区二区三区 | 国产福利在线免费观看| 一级二级三级在线观看| 成av人免费青青久| av高清在线| 国产精品日日爱| 国产在线观看91| 欧洲有码在线视频| 国产成人综合美国十次| 国产精品入口免费麻豆| 狂野欧美性猛交xxxx乱大交| 国产丝袜护土调教在线视频| 久热免费视频| 久久久久久久久亚洲精品| 精品美女视频在线观看免费软件| 大香伊人久久| 国产乱子伦三级在线播放| 青草av在线| 免费av在线| 福利视频在线看| 国产鲁鲁视频在线观看特色| 国产中文字幕在线看| 久久99亚洲网美利坚合众国| jizz在线免费观看| 热99在线观看| 超碰在线中文| 欧美日韩一区二区三区在线播放 | 欧美视频免费一区二区三区| 在线观看的av| 香蕉视频在线观看www| 亚洲最新永久观看在线| 亚洲an天堂an在线观看| 亚洲天堂视频在线观看免费| 亚洲а∨精品天堂在线| 久久国产热视频| 国产精品毛片一区二区三区四区 | 尤物视频在线观看| 丁香婷婷在线| 国产高清一区二区三区视频| 樱花草在线观看www| 激情网站在线| 国产午夜精品久久久久免费视| 国产成人无吗| 欧美日韩亚洲国内综合网| 成在在线免费视频| 国产超级va在线视频| 免费看黄视频网站| 国产精品186在线观看在线播放 | 五月婷婷丁香激情| 国产国语**毛片高清视频 | 久草网在线视频| 国产小黄视频| 三级小说一区| 国产成人无吗| 国产一级二级在线| 日本动漫理论片在线观看网站| eeuss影院www在线播放| 国产一二三四| xxx国产精品| 亚洲图区欧美| 在线中文资源天堂| 国产黄色av免费看| 中文字幕在线看精品乱码| 青草在线视频在线观看| 在线色视频观看| 精品日韩av| 国产95在线|亚洲| 国产一级视频| 国产一级免费黄色片| 国产麻豆一区二区三区精品| 欧美精品久久久久久久小说| 国产高清在线观看| 国产精品久久人| 国产精品第八页| 国产小视频在线播放| 国产鲁鲁视频在线观看免费| 欧美精品另类| 九色视频网站| 国产免费福利| 最新天堂资源在线| 国产羞羞视频在线播放| 午夜国产福利在线| 国产精品麻豆一区二区三区 | 爱福利在线视频| 在线色视频观看| 在线看a视频| 亚洲第一区视频| 青青草原国产在线| 国产精品一卡二卡三卡| 中文字幕国产欧美| 国产日韩网站| 精品成人一区二区三区免费视频| 国产福利免费观看| 亚洲xxxxxx| 国产麻豆麻豆| 国产不卡视频| 四虎久久影院| 成人免费一区二区三区牛牛| 最新国产在线精品91尤物| 国产高潮av| 久久精品免视着国产成人| 国产污视频在线| av中文网站| 国产精品久久久久一区二区国产 | 久久国产精品久久久久久小说| 国产毛片在线| av手机天堂| 国产日韩欧美精品一区二区三区| 精品一区二区观看| www.操操| ·天天天天操| 久久久久久久久亚洲精品| 国产成人精品实拍在线| 豆国产97在线|亚洲| 一级二级在线观看| 国产精品你懂的在线观看| 久热精品免费视频| 在线三级中文| 96精品视频| 国产一级在线观看www色| 日本高清中文字幕| 91在线超碰| 国产成人亚洲综合小说区| 国产美女性感在线观看懂色av| 精品美女在线观看视频在线观看 | 在线免费观看污| 国产特级淫片免费看| 浪潮av一区| 久久国产热视频| yjizz视频网站在线播放| 在线观看的av| 永久免费网站在线| av免费在线观看网站| 国产精品69xx| 国产天堂视频| 国产人成网在线播放va免费| 国产在线拍揄自揄拍视频| 欧美色第一页| 美女av在线播放| 超碰在线影院| 88av在线| 国产黄大片在线观看画质优化| 国产探花视频在线观看| 国产网红在线观看| 国产精品186在线观看在线播放| 国产区视频在线| 精品国产二区三区| 亚洲成人电视网| 国产专区在线播放| 国产香蕉免费精品视频| 2018中文字幕在线观看| 精品成人免费自拍视频 | www.色婷婷| 九色在线网站| 最好看更新中文字幕| 国产精品第八页| av在线你懂的| 国产一区二区三区美女秒播| 精品欧美色视频网站在线观看 | 亚洲欧美精品日韩欧美| eeuss影院网站免费观看| 九九热精品在线视频| 交视频在线观看国产| 国产精品国产国产aⅴ| www.色婷婷| 国产爆初菊在线观看免费视频网站| 国产高清视频在线播放| 日本视频在线观看一区二区三区| 青青久在线视频免费观看| 成人精品福利| 亚洲欧美中文字幕在线观看| 国产免费永久在线观看| 一二三四区在线观看| 中文字幕网在线| 麻豆av电影在线观看|