在CakePHP v3中的每个页面重新加载请求中都没有更新CSRF令牌

时间:2016-09-14 11:29:50

标签: cakephp cakephp-3.0 csrf

我在CakePHP v3中启用了csrf安全组件。在AppConroller.php方法

中的initialize()文件中

public function initialize(){

    // some of my other initialization here
    $this->loadComponent('Csrf');

    // some of my other initialization here

}

在View端我使用下面的代码

echo $this->Form->create(....);
// some of other stuffs
echo $this->Form->end();

是的,它会在form标记下方的隐藏字段中显示CSRF令牌,并带有CSRF令牌值。但是,在Page Reload之后.. CSRF令牌值保持不变。

CSRF令牌的实际概念,在每次请求时都会生成新的CSRF令牌。那么我们如何在CakePHP v3中实现这一目标呢?

2 个答案:

答案 0 :(得分:0)

实际上,在大多数应用程序中,实际上不需要为每个请求创建新的csrf令牌。每个用户会话一个很好,并且还提高了可用性(用户可以使用后退按钮等)。如果在登录时生成令牌,则攻击者仍然无法猜测它是否会向应用程序创建外部请求。话虽如此,每个请求的新csrf令牌可能稍微更安全,并且可能不太容易出现实现错误,但这并不是大多数应用程序中最薄弱的一点。

有关更详细的说明,请查看here

答案 1 :(得分:0)

CakePHP在创建表单时创建一个csrf标记,只有在没有已设置的表单时才会创建。您需要编写一个删除cookie的脚本(如果存在)。默认情况下,Cookie名称为csrfToken,但可以在初始化cookieName时使用$this->loadComponent('Csrf');作为参数手动设置

有些事情:

public function initialize() {
    parent::initialize();
    $this->loadComponent('Csrf');
    $this->loadComponent('Cookie');
}

public function beforeFilter(Event $event) {
    parent::beforeFilter($event);
    $cookieData = $this->request->cookie('csrfToken');
    if ($cookieData) {
        $this->Cookie->delete('csrfToken');
    }
}

csrfComponent位于vendor/cakephp/cakephp/src/controller/component/CsrfComponent.php