CSRF Codeigniter保护和AJAX调用

时间:2017-01-28 16:37:32

标签: jquery ajax codeigniter csrf-protection

我必须请求帮助来解决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几次正常工作? 抱歉我的英语不好,希望我解释了我的问题 非常感谢您的帮助

2 个答案:

答案 0 :(得分:0)

你的意思可能是:

var data = {"checked": changeCheckbox.checked};
    data[csrfName] = csrfHash; 

然后:

$.ajax({
    url: 'myphpfile',
    type: 'POST',        
    data : data
[...]

csrfName是一个变量,因此如果要添加以csrfName为内容命名的属性,则必须使用object [variable]语法。 写下:

data : {
    csrfName: csrfHash
}

您正在创建一个具有csrfName属性的对象,而不是其内容。

或者如果你正在使用ES6,你可以写:

data : {
    [csrfName]: csrfHash,
    "checked": changeCheckbox.checked
}

答案 1 :(得分:0)

请注意,您只需要使用jquery.cookie方法发送csrfhash和csrfcookie值,就可以更多地进行一次ajax调用。您可以下载jquery.cookie 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并完成。希望能帮到你