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

CSRF token mismatch in post request in 3.6 version

我有两个不同的 cakephp 应用程序。一个是3.5版,一个是3.6版。

当我使用和构建 3.5 应用程序时,我没有遇到 CSRF matching in post request. 的问题,但现在当我使用 3.6 时,它给我 CSRF 令牌错误。

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

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

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

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

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

最新的 3.6 应用程序模板现在默认使用 CSRF 中间件,请参阅您的应用程序 src/Application.php 文件。不幸的是,这个变化没有被正确记录下来,让人大吃一惊。

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

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

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

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

另见

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

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

我有同样的错误,没有使用 ajax,问题是管理主题没有使用 cakephp 3 form helper sintax,它是 html。

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

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

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