3.6版本中的post请求中的CSRF令牌不匹配

问题描述 投票:1回答:3

我有两个不同的cakephp应用程序。一个版本3.5和其他3.6。

当我使用并构建3.5应用程序时我没有CSRF matching in post request.的问题但是现在因为我使用3.6它给了我CSRF令牌的错误。

虽然在两个应用程序的AppController中,CSRF组件都是禁用的。

//$this->loadComponent('Csrf');

我正在使用这样简单的帖子请求:

$.ajax({
        type: "POST",
        url: "../user/my_action",
        dataType: 'json',
        success: function (data) {
            set_data(data.response);
        }
    });

我错过了什么?或者我做错了一些配置?

cakephp cakephp-3.0 csrf
3个回答
15
投票

最新的3.6应用程序模板现在默认使用CSRF中间件,请参阅您的应用程序src/Application.php文件。不幸的是,这种变化没有得到妥善记录,令人惊讶。

理想情况下,您不要禁用它,而是在您的AJAX请求旁边传递正确的CSRF令牌,您可以轻松地从视图模板中的请求对象中获取令牌,例如在布局中使其全局可用:

<script>
var csrfToken = <?= json_encode($this->request->getParam('_csrfToken')) ?>;
// ...
</script>

然后,您可以在AJAX请求中轻松使用它:

$.ajax({
    headers: {
        'X-CSRF-Token': csrfToken
    },
    // ...
});

也可以看看


2
投票

在$ .ajax()函数调用上添加此代码:

beforeSend: function (xhr) { // Add this line
        xhr.setRequestHeader('X-CSRF-Token', $('[name="_csrfToken"]').val());
 },  // Add this line

0
投票

我有同样的错误,没有使用ajax,问题是管理主题没有使用cakephp 3形式帮助sintax,它是HTML。

在我用Form-> create()?> Form-> end()?>后,它运行正常

© www.soinside.com 2019 - 2024. All rights reserved.