CakePHP没有在postlink中插入CSRF令牌

时间:2014-03-07 19:23:50

标签: php cakephp

我正在使用CakePHP 2.3.8而我的注销“按钮”我正在使用postlink。除非我解锁退出操作,否则我会收到黑洞响应。在安全组件启用时,Cake似乎没有像常规表单那样添加CSRF令牌。

这是我标题中的默认视图。

echo $this->Form->postLink(__('Log Out'), array('action' => 'logout', 'controller' => 'users'), null, __('Are you sure you want to log out?'));

以下是它产生的内容

<form action="/users/logout" name="post_531cbd2c9a3b6464512218" id="post_531cbd2c9a3b6464512218" style="display:none;" method="post">
    <input type="hidden" name="_method" value="POST">
</form>
<a href="#" onclick="if (confirm('Are you sure you want to log out?')) { document.post_531cbd2c9a3b6464512218.submit(); } event.returnValue = false; return false;">Log Out</a>

当我打印SecurityComponent.php的_validateCsrf方法的请求标记时,不会显示任何内容。

protected function _validateCsrf(Controller $controller) {

    $token = $this->Session->read('_Token'); //if I print this, it shows other tokens
    $requestToken = $controller->request->data('_Token.key');

    pr($requestToken); //nothing is displayed
    die();

    if (isset($token['csrfTokens'][$requestToken]) && $token['csrfTokens'][$requestToken] >= time()) {
        if ($this->csrfUseOnce) {
            $this->Session->delete('_Token.csrfTokens.' . $requestToken);
        }
        return true;
    }

    return false;
}

我是否误解了postlink安全性的处理方式?黑洞是由缺乏令牌造成的,还是我没有做其他事情?

编辑 - 我弄清楚了。很明显!

因为在我的默认布局上为标头生成了链接,所以该链接并不真正与任何特定控制器绑定。无论我是在UsersController还是PostsController中,都会使用相同的标头。因此,如果在UsersController上未启用安全性,并且我碰巧在UsersController操作的视图上,则不会出现令牌。如果我在启用了安全性的AdminsController中,则会出现令牌。

0 个答案:

没有答案