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

时间:2018-08-19 10:22:44

标签: cakephp cakephp-3.0 csrf

我有两个不同的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);
        }
    });

我想念什么?或某些配置我做错了?

4 个答案:

答案 0 :(得分:11)

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

理想情况下,您不禁用它,而是将正确的CSRF令牌与AJAX请求一起传递,可以轻松地从视图模板(例如,在布局中使其全局可用)的请求对象中获取该令牌:< / p>

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

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

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

另请参见

答案 1 :(得分:2)

对于 CakePHP 3.8 ,这对我有用。在 config \ routes.php 中 注释行:

//$routes->applyMiddleware('csrf');

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

我有同样的错误,没有使用ajax,问题是管理员主题没有使用cakephp 3表单助手sintax,它是html。

在我用Form-> create()?> Form-> end()?>更改后,它工作正常