CSRF Codeigniter 保护和 AJAX 调用
CSRF Codeigniter protection and AJAX call
我必须寻求帮助来解决 Codeigniter 中 AJX 调用的问题。
我的系统中启用了 CSRF 保护,通常即使使用 AJAX/jQuery 调用也能正常工作。
现在我遇到了以下代码的麻烦而且我无法修复它......只是非常头疼
我想做的是每次更改复选框状态时调用控制器(我正在使用 Switchery );我想让开关多次正常工作……而不仅仅是在第一次开关时。
javascript 代码如下:
$(document).ready(function() {
var csrfName = '<?php echo $this->security->get_csrf_token_name(); ?>';
var csrfHash = '<?php echo $this->security->get_csrf_hash(); ?>';
var changeCheckbox = document.querySelector('.js-switch'), changeField = document.querySelector('#results');
changeCheckbox.onchange = function() {
changeField.innerHTML = changeCheckbox.checked;
$.ajax({
url: 'myphpfile',
type: 'POST',
data : {
csrfName: csrfHash,
"checked": changeCheckbox.checked
},
dataType: "json",
success: function(result){
$("#results").append(result.error);
csrfName = result.csrfHash;
}
});
};
});
上面的脚本即使在第一次尝试时也不起作用,我收到 403 错误(禁止),所以 csrf 哈希根本没有传递....这真的很奇怪,因为如果我设置(使用PHP 回显代码)csrf 名称和 csrf 散列直接进入 S.ajax 数据括号,脚本工作正常......即使只有一次。
所以问题是:为什么 csrfName 和 csrfHash 变量没有传递数据?如何使 AJAX csrf 多次正常工作?
抱歉我的英语不好,希望我能解释我的问题
非常感谢您的帮助
大概你的意思是:
var data = {"checked": changeCheckbox.checked};
data[csrfName] = csrfHash;
然后:
$.ajax({
url: 'myphpfile',
type: 'POST',
data : data
[...]
csrfName
是一个变量,所以如果你想添加一个以 csrfName
的内容命名的 属性,你必须使用对象 [变量] 语法。
通过写作:
data : {
csrfName: csrfHash
}
您正在使用 csrfName
属性 创建一个对象,而不是其内容。
或者如果你使用的是 ES6,你可以这样写:
data : {
[csrfName]: csrfHash,
"checked": changeCheckbox.checked
}
请注意,您正在多次调用 ajax 您只需要使用 jquery.cookie 方法发送 csrfhash 和 csrfcookie values.here 您就可以下载 [=16] =] https://github.com/js-cookie/js-cookie
并像这样通过 ajax 传递 csrf 的值。
"data:<?php echo $this->security->get_csrf_token_name(); ?>": Cookies.get('csrf_cookie_name')
只需根据您的 cookie 名称更改 csrf_cookie_name,done.i 希望对您有所帮助
我必须寻求帮助来解决 Codeigniter 中 AJX 调用的问题。 我的系统中启用了 CSRF 保护,通常即使使用 AJAX/jQuery 调用也能正常工作。 现在我遇到了以下代码的麻烦而且我无法修复它......只是非常头疼 我想做的是每次更改复选框状态时调用控制器(我正在使用 Switchery );我想让开关多次正常工作……而不仅仅是在第一次开关时。 javascript 代码如下:
$(document).ready(function() {
var csrfName = '<?php echo $this->security->get_csrf_token_name(); ?>';
var csrfHash = '<?php echo $this->security->get_csrf_hash(); ?>';
var changeCheckbox = document.querySelector('.js-switch'), changeField = document.querySelector('#results');
changeCheckbox.onchange = function() {
changeField.innerHTML = changeCheckbox.checked;
$.ajax({
url: 'myphpfile',
type: 'POST',
data : {
csrfName: csrfHash,
"checked": changeCheckbox.checked
},
dataType: "json",
success: function(result){
$("#results").append(result.error);
csrfName = result.csrfHash;
}
});
};
});
上面的脚本即使在第一次尝试时也不起作用,我收到 403 错误(禁止),所以 csrf 哈希根本没有传递....这真的很奇怪,因为如果我设置(使用PHP 回显代码)csrf 名称和 csrf 散列直接进入 S.ajax 数据括号,脚本工作正常......即使只有一次。 所以问题是:为什么 csrfName 和 csrfHash 变量没有传递数据?如何使 AJAX csrf 多次正常工作? 抱歉我的英语不好,希望我能解释我的问题 非常感谢您的帮助
大概你的意思是:
var data = {"checked": changeCheckbox.checked};
data[csrfName] = csrfHash;
然后:
$.ajax({
url: 'myphpfile',
type: 'POST',
data : data
[...]
csrfName
是一个变量,所以如果你想添加一个以 csrfName
的内容命名的 属性,你必须使用对象 [变量] 语法。
通过写作:
data : {
csrfName: csrfHash
}
您正在使用 csrfName
属性 创建一个对象,而不是其内容。
或者如果你使用的是 ES6,你可以这样写:
data : {
[csrfName]: csrfHash,
"checked": changeCheckbox.checked
}
请注意,您正在多次调用 ajax 您只需要使用 jquery.cookie 方法发送 csrfhash 和 csrfcookie values.here 您就可以下载 [=16] =] https://github.com/js-cookie/js-cookie 并像这样通过 ajax 传递 csrf 的值。
"data:<?php echo $this->security->get_csrf_token_name(); ?>": Cookies.get('csrf_cookie_name')
只需根据您的 cookie 名称更改 csrf_cookie_name,done.i 希望对您有所帮助