如何在Cakephp 3中的ajax调用中定义CSRF令牌。另外,如何为某些ajax请求关闭CSRF

问题描述 投票:6回答:3

在Cakephp3中启用Csrf组件时。我如何在ajax调用中使用它。在此beforeSend参数中,ajax csrf标记在标头中设置。 csrfToken的价值是多少?因为它给出了错误

csrfToken未定义

beforeSend: function(xhr){
    xhr.setRequestHeader('X-CSRF-Token', csrfToken);
},

另外,如何禁用某些ajax调用的Csrf组件。

ajax cakephp csrf cakephp-3.x
3个回答
4
投票

CSRF组件将当前标记作为_csrfToken写入请求参数,您可以通过请求对象param()方法(或CakePHP 3.4中的getParam())获取它:

setRequestHeader('X-CSRF-Token', <?= json_encode($this->request->param('_csrfToken')); ?>);

可以通过从控制器事件管理器中删除CSRF组件来禁用它。您必须确定需要执行此操作的条件,例如针对特定操作,例如:

public function beforeFilter(\Cake\Event\Event $event)
{
    parent::beforeFilter($event);

    if ($this->request->param('action') === 'actionXyz') {
        $this->eventManager()->off($this->Csrf);
    }
}

如果您正在使用CSRF中间件,那么该令牌仍可用作名为_csrfToken的请求参数,但禁用中间件的工作方式不同,请参阅Cakephp 3.5.6 disable CSRF Middleware for controller

也可以看看


2
投票

每个表单都有一个隐藏的_csrfToken字段,当您启用Csrf组件时会自动添加该字段。现在你可以通过像$('[name="_csrfToken"]').val()这样的jquery轻松获得这个字段的标记。

ajax调用将如下所示:

$.ajax({
   url: 'someUrl',
   headers : {
      'X-CSRF-Token': $('[name="_csrfToken"]').val()
   },
   type: 'post',
   ...
});

0
投票

CakePHP 3

请不要为任何特定操作解锁字段/禁用CSRF安全组件。这对表单安全性很重要。

对于那些得到“请求已被黑洞”的人。 ,“表格篡改错误”,“您无权访问该位置。”或“POST数据中的意外字段”。这主要是由于CSRF组件按预期工作。

禁用或修改它不是一种解决方案。请遵循正确的方法,而不是禁用。在上面的情况下,请尝试序列化表格,这应该是魔术。

var el = $("#xyzForm");

var ajaxTPCalls = el.serializeArray();
  $.ajax({
                            type: el.attr('method'),
                            async: true,
                            url:  el.attr('action'),
                            data: ajaxTPCalls,
                            dataType: "json",
                            cache: false,
                            success: function (data) {

                                toastr.success(data.message, data.title);
                            },
                            error: function (jqXHR) {
                                if (jqXHR.status == 403) {
                                    $("body").html(jqXHR.responseText);
                                }
                            }
                        });

这样您就不会禁用CSRF或解锁任何字段。

© www.soinside.com 2019 - 2024. All rights reserved.