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

时间:2017-06-09 09:58:00

标签: ajax cakephp csrf cakephp-3.x

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

  

未定义csrfToken

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

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

3 个答案:

答案 0 :(得分: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 < /强>

另见

答案 1 :(得分:1)

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

ajax调用将如下所示:

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

答案 2 :(得分:-1)

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或解锁任何字段。