本文介绍了3.6版本中的发布请求中的CSRF令牌不匹配的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个不同的Cakephp应用程序。一个版本为3.5,另一个版本为3.6。

I have two different apps of cakephp. One has a version 3.5 and other 3.6.

当我使用并构建了3.5个应用程序时,我在发布请求时没有遇到 CSRF匹配的问题。 但是现在当我使用3.6时,它给了我CSRF令牌错误。

When i used and built 3.5 app i did not have a problem of CSRF matching in post request. But now as i am using 3.6 it is giving me error of CSRF token.

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

Although in both app's AppController, CSRF component is disable.

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

我正在使用简单这样的发布请求:

i am using simple post request like this:

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

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

What am i missing? or some configuration i have done wrong?

推荐答案

最新的3.6应用程序模板现在默认情况下使用CSRF中间件,请参见您的应用程序 src / Application .php 文件。不幸的是,此更改没有得到适当的记录,并给人们带来了惊喜。

The latest 3.6 application template now uses the CSRF middleware by default, see your apps src/Application.php file. Unfortunately this change hasn't been documented properly, and hit people by surprise.

理想情况下,您不会禁用它,而是将正确的CSRF令牌与AJAX请求一起传递,您可以轻松地从视图模板中的请求对象获得令牌,例如在布局中使其在全球范围内可用:

Ideally you do not disable it, but instead pass the proper CSRF token alongside with your AJAX requests, you can easily obtain the token from the request object in your view templates, for example in the layout to make it globally available:

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

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

You can then easily use it in your AJAX requests:

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

另请参见




  • Cookbook > Middleware > Cross Site Request Forgery (CSRF) Middleware
  • Cookbook > Middleware > CSRF Protection and AJAX Requests

这篇关于3.6版本中的发布请求中的CSRF令牌不匹配的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-23 18:12