我在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中实现这一目标呢?
答案 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