请问防csrf时,yii生成的token有时效性吗?
同一个页面反复刷新,\YII::$app->request->csrfToken; 页面中这个值是一直变化的。
但是同一个页面里反复发送ajax的post请求,用着同一个token却一直可以通过。
甚至一个可通过的token在之后的请求中反复使用,依然可以通过。
这个页面生成的token在其他页面依然可用,那又为什么要每个页面都要生成新的token呢?
同一个页面反复刷新,\YII::$app->request->csrfToken; 页面中这个值是一直变化的。
但是同一个页面里反复发送ajax的post请求,用着同一个token却一直可以通过。
甚至一个可通过的token在之后的请求中反复使用,依然可以通过。
这个页面生成的token在其他页面依然可用,那又为什么要每个页面都要生成新的token呢?
2017-03-03
public 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; }
举报