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 希望对您有所帮助