繁体   English   中英

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

[英]How to define CSRF token in ajax call in Cakephp 3. Also How CSRF can be off for some ajax requests

在 Cakephp3 中启用 Csrf 组件时。 我如何在 ajax 调用中使用它。 在这种beforeSend AJAX CSRF令牌在首部设置的参数。 csrfToken的价值是csrfToken 因为它给出了错误

csrfToken 未定义

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

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

CSRF 组件将当前令牌作为_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的请求参数,禁用中间件的工作方式有所不同,请参阅例如Cakephp 3.5.6 disable CSRF Middleware for controller

另见

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

ajax 调用将如下所示:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM