Yii2 crsf的機制

由request產生token,丟給response的cookie(見request::generateCsrfToken())。
當response::send()的時候會一併呼叫response::sendCookies()(在response::sendHeaders()),
如果request有丟給response csrfToken的cookie時,
這時就會設定csrfToken到cookie裡。

上面的流程是產生csrfToken時會做的,像是第一次(cookie不存在csrfToken)或者重新產生csrfToken的時候。

當已經存在csrfToken的時候就不會再執行上述的動作,
直接利用cookie裡的csrfToken,所以response也不會再重新設定csrfToken到cookie。

當呼叫request::getCsrfToken()或request::csrfToken,request會取得cookie裡的csrfToken。
當取得的csrfToken為null時,request才會去執行上述產生token的流程。

另外,需要注意的是實際的csrfToken和request產生或取得的csrfToken並不一樣。
而cookie裡的csrfToken和實際的csrfToken也不一定一樣,因為預設狀況下,request是有做cookieValidation
所以response在設定cookie時將csrfToken加密後再設定到cookie(見response::sendCookies())。

最後就是當controller::beforeAction()時會呼叫request::validateCsrfToken()來檢查csrfToken。

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *