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

2023-11-27

在Cakephp3中启用Csrf组件时。我如何在ajax调用中使用它。 在这个beforeSendajax csrf token 的参数在 header 中设置。有什么价值csrfToken。因为它给出了错误

csrfToken 未定义

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

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


CSRF 组件将当前令牌写入请求参数,如下所示_csrfToken,您可以通过请求对象获取它param()方法(或getParam()从 CakePHP 3.4 开始):

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 禁用控制器的 CSRF 中间件

See also

  • 食谱 > 请求和响应对象 > 请求参数
  • Cookbook > 控制器 > 组件 > CSRF > 使用 CsrfComponent
  • Cookbook > 控制器 > 组件 > CSRF > 禁用 CSRF 组件以执行特定操作
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐