打开YII_CSRF_TOKEN安全标志

zyfwsgd6  于 2022-11-09  发布在  其他
关注(0)|答案(2)|浏览(159)

我已经在Yii中启用了CSRF验证:
'enableCsrfValidation' => true,
一切都按预期工作,但我希望会话cookie有secure标志打开。
对于其他Cookie,您可以在config:

'session'=>array(
    'cookieParams' => array(
        'httponly'=>true,
        'secure' => true,
    ),
),

对于YII_CSRF_TOKEN,您如何做到这一点?

wtzytmuj

wtzytmuj1#

将以下内容添加到配置中:

'components' => array(
    'request' => array(
        'csrfCookie'=>array(
            'secure'=>true,
        ),
    ),
),
swvgeqrz

swvgeqrz2#

内置的CHttpRequest组件无法实现这一点。您需要从它派生并覆盖createCsrfCookie()来创建一个安全的cookie,如下所示:

class CustomHttpRequest extends CHttpRequest {

    protected function createCsrfCookie()
    {
        $cookie=new CHttpCookie($this->csrfTokenName,sha1(uniqid(mt_rand(),true)));
        $cookie->secure = true; //Here is where you make your cookie secure
        if(is_array($this->csrfCookie))
        {
            foreach($this->csrfCookie as $name=>$value)
                $cookie->$name=$value;
        }
        return $cookie;
    }

}

在组件配置中,指定自定义实现:

'components'=>array(
        ....,
        'request' => array(
            'class' => 'CustomHttpRequest',
            'enableCsrfValidation' => true,
        ),

重要提示:要生成新的CSRF令牌,您需要启动新的浏览器会话。此外,您还需要使用HTTPS以使安全Cookie生效。
删除您的开发URI的所有Cookie,或启动一个私人会话(在Chrome或Firefox中)以启动一个新会话。

相关问题