CakePHP3 ~ CSRF-token 第二个函数不匹配
CakePHP3 ~ CSRF-token mismatch on second function
我目前正在开发一个 JavaScript 可靠的系统,该系统与 CakePHP 3 框架一起工作,如 back-end。我的面板中的所有操作都在同一页面/url 上执行,它是一个one-page-application。目前我有一堆功能在工作,并决定是时候研究 CakePHP 3 的 CSRF-component 了。当我启用它时,我收到 400 错误,表明没有给出 CSRF-token。经过大量研究后,我找到了解决方案,即通过 FormMaker 或在我的 JQuery ajax 请求中手动实现令牌来解决这个问题。这很有效,所以我决定在下一个功能中也实现它。但正如您可能猜到的那样,这没有用。第二个 ajax 请求给出 CSRF-token 不匹配。请看下面我的代码:
我的第一个实际有效的请求:
function getSectionData(controller, method = null) {
fetch("<?=$this->Url->build(['controller' => '']);?>" + "/" + controller + "/getSectionData", {
method: 'POST',
headers: {
"Content-Type": "application/json",
"X-CSRF-Token": <?= json_encode($this->request->param('_csrfToken')); ?>
},
body: JSON.stringify({
method: method
})
})
.then((res) =>
res.json())
.then((data) => {
console.warn(data);
let response = data.response;
if (response.success == 1) {
// Action to do when data has been received
let method = response.method;
let rows = response.rows;
window[method](controller, rows);
} else if (response.success == 0) {
// Message when an error occures
}
})
.catch((err) => console.log(err))
}
最终,第二个功能在不到一秒后被激活:
function renderElement(element, id, data = null) {
let path = "<?= $this->request->here; ?>" + "/renderElement/" + element;
$('#' + id).load(path, {
data: data,
headers: {
"X-CSRF-Token": <?= json_encode($this->request->param('_csrfToken')); ?>
}
});
}
在这个函数中,我从另一个可以包含 data-elements 的文件中加载一个预设 HTML 元素,这就是它首先从控制器请求数据的原因。我使用与第一个函数相同的 headers 并且 CSRF-token 出现在控制台中。但它不起作用并抛出不匹配错误。我想知道为什么会出现此错误以及如何解决它,例如,我是否必须刷新它以及如何刷新它?
请注意,我使用的是 3.6 更新之前的 CakePHP 3 版本,它删除了 CSRF 组件并添加了 CRSF 中间件。
提前致谢。
jQuery.load()
函数不接受 AJAX 配置参数,第二个参数要么是回调,要么是定义要提交的 POST 数据的 object与请求一起。
您要么必须切换到使用可配置的 AJAX 请求(例如在您的第一个代码段中),要么全局配置 jQuery 以设置所需的 header所有 AJAX 个请求:
$.ajaxSetup({
headers: {
'X-CSRF-Token': <?= json_encode($this->request->param('_csrfToken')); ?>
}
});
另见
我目前正在开发一个 JavaScript 可靠的系统,该系统与 CakePHP 3 框架一起工作,如 back-end。我的面板中的所有操作都在同一页面/url 上执行,它是一个one-page-application。目前我有一堆功能在工作,并决定是时候研究 CakePHP 3 的 CSRF-component 了。当我启用它时,我收到 400 错误,表明没有给出 CSRF-token。经过大量研究后,我找到了解决方案,即通过 FormMaker 或在我的 JQuery ajax 请求中手动实现令牌来解决这个问题。这很有效,所以我决定在下一个功能中也实现它。但正如您可能猜到的那样,这没有用。第二个 ajax 请求给出 CSRF-token 不匹配。请看下面我的代码:
我的第一个实际有效的请求:
function getSectionData(controller, method = null) {
fetch("<?=$this->Url->build(['controller' => '']);?>" + "/" + controller + "/getSectionData", {
method: 'POST',
headers: {
"Content-Type": "application/json",
"X-CSRF-Token": <?= json_encode($this->request->param('_csrfToken')); ?>
},
body: JSON.stringify({
method: method
})
})
.then((res) =>
res.json())
.then((data) => {
console.warn(data);
let response = data.response;
if (response.success == 1) {
// Action to do when data has been received
let method = response.method;
let rows = response.rows;
window[method](controller, rows);
} else if (response.success == 0) {
// Message when an error occures
}
})
.catch((err) => console.log(err))
}
最终,第二个功能在不到一秒后被激活:
function renderElement(element, id, data = null) {
let path = "<?= $this->request->here; ?>" + "/renderElement/" + element;
$('#' + id).load(path, {
data: data,
headers: {
"X-CSRF-Token": <?= json_encode($this->request->param('_csrfToken')); ?>
}
});
}
在这个函数中,我从另一个可以包含 data-elements 的文件中加载一个预设 HTML 元素,这就是它首先从控制器请求数据的原因。我使用与第一个函数相同的 headers 并且 CSRF-token 出现在控制台中。但它不起作用并抛出不匹配错误。我想知道为什么会出现此错误以及如何解决它,例如,我是否必须刷新它以及如何刷新它?
请注意,我使用的是 3.6 更新之前的 CakePHP 3 版本,它删除了 CSRF 组件并添加了 CRSF 中间件。
提前致谢。
jQuery.load()
函数不接受 AJAX 配置参数,第二个参数要么是回调,要么是定义要提交的 POST 数据的 object与请求一起。
您要么必须切换到使用可配置的 AJAX 请求(例如在您的第一个代码段中),要么全局配置 jQuery 以设置所需的 header所有 AJAX 个请求:
$.ajaxSetup({
headers: {
'X-CSRF-Token': <?= json_encode($this->request->param('_csrfToken')); ?>
}
});
另见