Cakephp - CSRF 令牌不匹配

2024-05-12

我在 Cakephp 3.6 中有一个项目,其中 MessageController 中的 3 个操作由 Ajax 调用。但是,我有一个问题,当我向其中一个操作发送请求时,XHR 会向我返回以下内容:

{
   "message": "CSRF token mismatch.",
   "url": "\/messages\/changepriority\/8",
   "code": 403,
   "file": "D:\\xampp\\htdocs\\myapp\\vendor\\cakephp\\cakephp\\src\\Http\\Middleware\\CsrfProtectionMiddleware.php",
"line": 195
}

这是我尝试从 Ajax 调用的操作之一:

public function changepriority($id=null) 
{
    $this->autoRender = false;
    $message = $this->Messages->get($id);
    $message->priority = ($message->priority === false) ? true : false;
    if ($this->Messages->save($message)) {
        echo json_encode($message);
    }
}

这是我的ajax:

$(".email-star").click(function(){
        var idmessage = this.id;
        $.ajax({
        headers : {
              'X-CSRF-Token': $('[name="_csrfToken"]').val()
           },
         dataType: "json",
         type: "POST",
         evalScripts: true,
         async:true,
         url: '<?php echo Router::url(array('controller'=>'Messages','action'=>'changepriority'));?>' +'/'+idmessage,
         success: function(data){
            if(data['priority'] === false) {
                $("#imp_" + idmessage).removeClass("fas").removeClass('full-star').addClass( "far" );
            }
            else {
                $("#imp_" + idmessage).removeClass("far").addClass( "fas" ).addClass("full-star");
            }
          }
         });
    });

我已阅读有关跨站点请求伪造的文档,并且我尝试首先使用以下命令关闭这些操作的 Csrf:

public function beforeFilter(Event $event)
{
     $this->getEventManager()->off($this->Csrf);
}

然后:

public function beforeFilter(Event $event)
{
     $this->Security->setConfig('unlockedActions', ['index', 'changepriority']);
}

但什么也没有。 Xhr 始终返回 CSRF 令牌不匹配。 我能做些什么 ?

Edit:

我这样改变动作:

    public function changepriority($id=null) 
{
    $this->autoRender = false;
    $message = $this->Messages->get($id);
    $message->priority = ($message->priority === false) ? true : false;
    if ($this->Messages->save($message)) {
        $content = json_encode($message);
        $this->response->getBody()->write($content);
        $this->response = $this->response->withType('json');
        return $this->response;
    }
}

这样,行动就发挥作用了。可以这样吗?


首先检查您的$('[name="_csrfToken"]').val()输出。

如果没有得到任何输出,需要检查csrfToken隐藏字段是否存在。只需右键单击您的页面,然后单击View Page Source

如果不存在,则说明您在创建表单时没有遵循正确的方法。基本上,当使用以下命令创建表单时Cake\View\Helper\FormHelper,添加一个包含 CSRF 令牌的隐藏字段。

如果一切正确,请在 ajax 调用中添加以下行header

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

诗。 cakePHP 不建议禁用 CSRF,并且大多数开发人员都意识到这一点。希望这有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cakephp - CSRF 令牌不匹配 的相关文章

  • 如何在 PHP 中去除字符串中的所有空格? [复制]

    这个问题在这里已经有答案了 我怎么能够strip remove all spaces of a string in PHP 我有一个string like string this is my string 输出应该是 thisismystr
  • 开发中的 Laravel 和视图缓存——无法立即看到变化

    我和一些朋友决定开始一个项目 我们偶然发现了 Laravel 并认为它可能是一个很好的工具 我们开始在本地使用它来开发一些页面 并注意到一些奇怪的事情 当我们用不同的信息更新视图时 大约需要 5 到 10 分钟视图信息才会发生变化 这就像
  • Laravel 克隆查询字符串

    是否可以克隆一个查询字符串 以便我可以编写一次并在不影响其他结果的情况下进行长时间的更改 query DB table users gt where id 123 queryGet query queryPaginate query que
  • cURL 错误 (35):错误:14077458:SSL 例程:SSL23_GET_SERVER_HELLO:tlsv1 无法识别的名称

    我一直在使用以下代码块使用 cURL 从 HTTPS 网站收集数据 q https www example org for example ch curl init curl setopt ch CURLOPT URL q curl set
  • 如何限制ajax日历扩展器中的年份

    我有一个日历延长器 我只想在日历中显示当前年份 用户无法选择 2010 年 因为当前年份是 2011 年 那么如何做到这一点呢 Use the StartDate and EndDate属性来设置您希望允许用户选择的可接受日期范围 您可以根
  • 从 Joomla 3 url 中删除文章 ID

    我正在尝试从 Joomla 3 URL 中删除文章 ID 我四处搜寻 得到的答复是 组件 com content router php 将 0 更改为 1 advanced params gt get sef advanced link 1
  • 无法在 $.ajax 请求上设置 HTTP 主机标头

    之前已经以不同的方式讨论过这个主题 但我还没有找到适合我的解决方案 我正在使用jquery 1 7 1 我有一个 REST 风格的 Web 服务 可以返回 JSON 和 XML 但对于这个项目 我需要使用 XML 端点 为了绕过跨域限制 我
  • php 的 SCORM 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们为一位客户开发了电子学习网站 最近他询问需要 SCORM feed 我不知道我的系统是否与 scr
  • 有什么好的适用于 Google App Engine 应用程序的 AJAX 框架吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试在我的 Google App Engine 应用程序中实现 AJAX 因此我正在寻找一个好的
  • 让 PHP 脚本永远循环执行队列系统中的计算作业

    目前 我有一个永远在我的服务器上运行的 perl 脚本 检查 SQS 是否有要计算的数据 该脚本已经运行了大约 6 个月 没有出现任何问题 所以 现在我想切换到 PHP 的 CLI 并让脚本永远循环在那里 主要是因为我对PHP比较熟悉 Ba
  • 从 https 切换到 http 时违反 RewriteRule

    我写了很多重写规则 in my htaccess文件 但是当我从https to http页面 它不遵守这些规则 NOTE 本地主机上一切正常 问题出在服务器上 UPDATE 这是我的website http www charityrumm
  • 交响乐 2 |修改具有文件(图片)字段的对象时出现表单异常

    我正在使用 Symfony2 我有一个实体Post有标题和图片字段 我的问题 当我创建帖子时一切都很好 我有我的图片等 但是当我想修改它时 我遇到了 图片 字段的问题 它是一个上传的文件 Symfony 想要一个文件类型并且它有一个字符串
  • 创建验证电子邮件的机制

    我的网站上已经有一个高级用户登录 注册系统 colemansystems psm2 co uk http colemansystems psm2 co uk 但是 我希望向新用户发送一封电子邮件以验证他们的电子邮件地址 如果他们没有点击该链
  • Symfony2 将复选框值从 0/1 更改为“no”/“yes”

    我创建了一个带有一个复选框的表单 用户设置类型 php public function buildForm FormBuilderInterface builder array options builder gt add newslett
  • 由带有换行符的 DOMDocument 生成的 XML

    我正在使用 PHP DOMDocument 创建 XML 文件 并且这些 XML 文件不能包含换行符 但是当我使用该方法时 保存 XML 生成的 XML 在定义和初始标记之间有一个换行符 如下所示
  • 更新 xampp 中的 ICU 扩展吗?

    我在跑xampp我需要升级ICU php intl 扩展 到最新版本 我下载了54从 ICU 页面 但不确定如何升级它 有一个bin include and lib文件夹 我应该把这些文件放在哪里 我还需要做其他事情吗 要升级 XAMP 安
  • 在 Slim Framework 3 中访问课堂上的应用程序

    当路由位于与 index php 不同的类中时 我无法理解如何访问 Slim 的实例 当使用 Slim Framework 2 时 我总是使用以下内容 但它在 Slim 3 中不起作用 this gt app Slim Slim getIn
  • 如何防止显示菱形问号符号,即使使用 mb_substr 和 utf-8

    我读过其他一些问题 尝试了答案 但最终没有结果 我得到的是例如这个 我无法删除那个奇怪的问号 我所做的就是获取 RSS feed 的内容 该内容也被编码为内容使用希腊语 有没有什么办法解决这一问题 div div
  • 在 url 中传递百分号 (%) 并使用 php 获取其准确值

    我正在尝试在 url 中传递百分号 例如 B6011000995504101 SB 但当我回声时 它又回来了 011000995504101 SB 我想要与在 URL 中传递的值完全相同的值 我尝试使用 urlencode 函数 但它给了我
  • 通过jquery ajax()和serialize()提交html表单

    我想通过 jquery ajax 提交此表单 这是我所做的 但它不起作用 即表单正在提交并刷新页面 但我没有看到响应 即在同一页面上打印数组 HTML

随机推荐