在Cakephp3中启用Csrf组件时。我如何在ajax调用中使用它。
在此jjax的beforeSend
参数中,csrf标记在标头中设置。 csrfToken
的价值是多少?因为它给出了错误
未定义csrfToken
beforeSend: function(xhr){
xhr.setRequestHeader('X-CSRF-Token', csrfToken);
},
另外,如何禁用某些ajax调用的Csrf组件。
答案 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或解锁任何字段。