【问题标题】:CSRF token mismatch in post request in 3.6 version3.6 版本发布请求中的 CSRF 令牌不匹配
【发布时间】:2019-01-25 18:04:36
【问题描述】:

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

我错过了什么?还是我做错了一些配置?

【问题讨论】:

  • 尝试删除您的 cookie 和缓存。

标签: cakephp cakephp-3.0 csrf


【解决方案1】:

最新的 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
    },
    // ...
});

另见

【讨论】:

  • ndm 很抱歉迟到了,您的解决方案效果很好。我得到的问题是ajax url。由于 ajax 发布请求的变化,我认为他们也改变了在 ajax 中创建 url 的方式。
  • 当我使用 3.5 cake 时,它​​没有自动附加站点 URL。 ../controller/action 工作正常。它必须与 csrf 做点什么??
  • @fatpotato 不,URL 的外观与 CSRF 保护无关。您应该使用 Router::url()the URL helper(用于 JS 时需要禁用转义)来构建正确的根相对 URL。
  • 我应该把这个url传给ctp文件,然后在js文件中捕获?
  • @fatpotato 就像使用令牌一样,是的。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    在我用 Form->create() 更改后?> Form->end() ?> 效果很好

    【讨论】:

    • 为我工作,但需要在 $.ajax 调用中: beforeSend: function (xhr) { xhr.setRequestHeader('X-CSRF-Token', $('[name="_csrfToken"]' ).val()); },
    【解决方案4】:

    对于 CakePHP 3.8,这对我有用。在 config\routes.php 如此评论该行:

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

    【讨论】:

    • 感谢您的回答。虽然这是另一种方法,但您不应禁用它。因为这是基本和主要的安全措施。
    猜你喜欢
    • 1970-01-01
    • 2017-07-15
    • 2015-12-20
    • 2014-11-04
    • 2017-06-12
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多