2015-04-01 122 views
0

我的CSRF令牌似乎超时。有什么办法可以防止这种情况发生?Yii中的CSRF令牌超时?

我有一个单页的应用程序,我的前端是用AngularJS编写的。在大多数情况下,我的CSRF令牌的验证没问题,我可以确认我通过每个请求发送令牌。但是,偶尔我会看到来自服务器的错误,指出“CSRF令牌无法验证”。我不完全理解CSRF令牌如何验证的内部结构,但是为什么会出现这种情况?

我们的应用程序也是国际化的,但由于我们的服务器基础设施,某些地理区域的速度放缓。我注意到(只是临时的),例如,如果用户正在上传文件,并且请求比平时花费的时间更长,则CSRF令牌无效的可能性更高。

想听听关于此的任何想法!提前致谢!

+0

您是否为每个请求生成CSRF令牌? – TNC 2015-04-01 03:52:44

回答

0

我认为Yii正在对CSRF进行验证,尝试扩展CHttpRequest基类并根据会话进行验证。这会导致会话持续时间与CSRF有效性相反。

class HttpRequest extends CHttpRequest 
{ 
    public function getCsrfToken() 
     { 
      if ($this->_csrfToken === null) { 
       $session = Yii::app()->session; 
       $csrfToken = $session->itemAt($this->csrfTokenName); 
       if ($csrfToken === null) { 
        $csrfToken = sha1(uniqid(mt_rand(), true)); 
        $session->add($this->csrfTokenName, $csrfToken); 
       } 
       $this->_csrfToken = $csrfToken; 
      } 

      return $this->_csrfToken; 
     } 

     public function validateCsrfToken($event) 
     { 
      if ($this->getIsPostRequest()) { 
       // only validate POST requests 
       $session = Yii::app()->session; 

       $headers = Common::getAllHeaders(); 

       if ($session->contains($this->csrfTokenName) && (isset($_POST[$this->csrfTokenName]) || isset($headers['X-Csrf-Token']))) { 
        $tokenFromSession = $session->itemAt($this->csrfTokenName); 
        $tokenFromPost = isset($_POST[$this->csrfTokenName]) ? $_POST[$this->csrfTokenName] : $headers['X-Csrf-Token']; 
        $valid = $tokenFromSession === $tokenFromPost; 
       } else { 
        $valid = false; 
       } 
       if (!$valid) { 
        header("Location: " . Yii::app()->createAbsoluteUrl(Yii::app()->request->url)); 
       } 
      } 
     } 
} 

而且使用它作为您的配置文件:

'request' => array(
      'enableCsrfValidation' => true, 
      'class' => 'HttpRequest', 

      'csrfCookie' => array(
       'httpOnly' => true, 
       'secure' => true 
      ), 

注:DONOT复制和粘贴的所有内容。根据您的需要修改。这只是一个开始。希望我明白你的问题。