【问题标题】:CSRF Codeigniter protection and AJAX callCSRF Codeigniter 保护和 AJAX 调用
【发布时间】:2017-06-14 05:02:06
【问题描述】:

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

【问题讨论】:

    标签: jquery ajax codeigniter csrf-protection


    【解决方案1】:

    请注意,您只需要使用 jquery.cookie 方法来发送 csrfhash 和 csrfcookie 值。您可以在此处下载 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即可。希望对你有所帮助

    【讨论】:

      【解决方案2】:

      你的意思大概是:

      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
      }
      

      【讨论】:

      • 另请注意document.querySelector 仅返回第一个匹配元素...并非所有匹配项
      • 非常感谢您的反馈和 cmets。亚当,你的暗示解决了这个问题;现在脚本在第一个复选框开关处工作正常。我应该编辑 csrfName = result.csrfHash;排在成功函数中以使其工作不止一次?
      • 只是为了添加更多信息...我检查了 PHP 脚本返回的 JSON 代码,它为下一次 POST 提交正确地提供了新哈希:` csrfHash : "18911515b6521496f1dfcfa88bc5da6d" csrfName : "csrf_ats_name" `
      • @Federico 是的,它应该可以工作,如果没有,则声明变量超出了就绪函数的范围
      • Negative :( ...我不能再调用 AJAX 一次。我将 var csrfHash 和 var csrfName 移到 ready 函数之外...但我无法为下一次 AJAX 调用获取新哈希...仍然从服务器收到 403 错误。我真的不知道如何解决这个问题...
      猜你喜欢
      • 2012-02-03
      • 2023-03-08
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      • 2013-09-20
      • 2011-10-23
      • 2013-02-13
      • 2016-02-10
      相关资源
      最近更新 更多