在Cakephp3中启用Csrf组件时。我如何在ajax调用中使用它。在此beforeSend
参数中,ajax csrf标记在标头中设置。 csrfToken
的价值是多少?因为它给出了错误
csrfToken未定义
beforeSend: function(xhr){
xhr.setRequestHeader('X-CSRF-Token', csrfToken);
},
另外,如何禁用某些ajax调用的Csrf组件。
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
也可以看看
每个表单都有一个隐藏的_csrfToken
字段,当您启用Csrf组件时会自动添加该字段。现在你可以通过像$('[name="_csrfToken"]').val()
这样的jquery轻松获得这个字段的标记。
ajax调用将如下所示:
$.ajax({
url: 'someUrl',
headers : {
'X-CSRF-Token': $('[name="_csrfToken"]').val()
},
type: 'post',
...
});
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或解锁任何字段。