首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Cakephp 3中定义ajax调用中的CSRF令牌。另外,如何为某些ajax请求关闭CSRF

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

Stack Overflow用户
提问于 2017-06-09 17:58:00
回答 3查看 9.8K关注 0票数 7

在Cakephp3中启用Csrf组件时。如何在ajax调用中使用它。在此beforeSend中,ajax的csrf令牌参数设置在header中。csrfToken的价值是什么?因为它给出了错误

未定义

csrfToken

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-09 18:25:59

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

beforeSend: function(xhr){
    xhr.setRequestHeader(
        'X-CSRF-Token',
        <?= json_encode($this->request->param('_csrfToken')); ?>
    );
},

要使令牌对所有脚本可用,例如,可以使其作为布局模板中的变量全局可用:

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

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

setRequestHeader('X-CSRF-Token', 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的请求参数使用,但是禁用中间件的工作方式有所不同,请参见示例

另请参阅

票数 7
EN

Stack Overflow用户

发布于 2018-07-21 20:03:53

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

ajax调用将如下所示:

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

Stack Overflow用户

发布于 2018-09-20 19:32:55

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,也不会解锁任何字段。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44454785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档