【问题标题】:CSRF Protections with AJAX & FORM - CodeIgniter - Not Sending使用 AJAX 和 FORM 的 CSRF 保护 - CodeIgniter - 不发送
【发布时间】:2017-05-28 23:33:59
【问题描述】:

一开始我关闭了我的 CSRF 只是为了简单的原因让我的表单/ajax 工作。现在,当我打开它并尝试使用 CSRF 的输入和内容时,什么都不起作用。我的表单没有提交,或者当它刷新我的整个页面时,我不能让这种情况发生。这是我当前的代码。

form method="post">
  <input type="text" name="vip_text_box" id="vip" value="<?php echo $total_amount ?>"> <br><br>
  <input type="submit" id="submit" value="Redeem" onclick="return rebate_amount()">
  <input type="hidden" name="<?php echo $this->security->get_csrf_token_name(); ?>" value="<?php echo $this->security->get_csrf_hash(); ?>">
</form>

还有 AJAX:

function rebate_amount(){

  var value = document.getElementById('vip').value;
  var datastring = 'vip='+value;
  var url = base_url + '/index.php/home/redeeming_form_value';

  $.ajax({
    type : 'post',
    url : url,
    data: datastring,
    cache: false,
    success: function(html){

      $('#vip_point_redeeming').html(html);

    }
  });
  return false;
}

请记住。当配置文件中的 CSRF 关闭时,这一切都有效。但我认为 CSRF 与 form / ajax 存在问题。

【问题讨论】:

  • 您的 AJAX 请求构造了一个 POST 操作,但未能提供 CSRF 令牌。当 CodeIgniter 收到 POST 操作时,它找不到 TOKEN 并在你有机会运行任何代码之前关闭所有东西。

标签: php ajax forms codeigniter csrf


【解决方案1】:

您还应该在数据中包含csrf_token

500 内部服务器错误

您的 AJAX 请求构造了一个 POST 操作,但未能提供 CSRF 令牌。 CodeIgniter 收到 POST 操作时,失败 找到 TOKEN 并在你有机会之前关闭一切 运行任何代码,因此您会收到 500 内部服务器错误

任你选择

data :  $("#your_form").serialize();

data: {
        '<?php echo $this->security->get_csrf_token_name(); ?>':'<?php echo $this->security->get_csrf_hash(); ?>',

           /*....your data....*/
           vip:document.getElementById('vip').value
       },

你的函数看起来有点

function rebate_amount(){

var url = base_url + '/index.php/home/redeeming_form_value';

$.ajax({
    type : 'post',
    url : url,
    data: {
    '<?php echo $this->security->get_csrf_token_name(); ?>':'<?php echo $this->security->get_csrf_hash(); ?>',

       /*....your data....*/
       vip:document.getElementById('vip').value
    },
    cache: false,
    success: function(html){
      $('#vip_point_redeeming').html(html);
    }
  });
  return false;
}

【讨论】:

  • 这看起来不错。不确定 AJAX 代码在哪里定义,但您需要 CodeIgniter 将 CSRF 令牌输入其中,以便您可以将其与 POST 数据一起传递。
  • 我假设在视图中定义了ajax代码,所以当用户通过$this-&gt;load-&gt;view(..)加载视图时,数据可以预先填充令牌和值,如果没有他仍然可以序列化
  • 一个合理的假设。我没有测试过。我只是想为 OP 提供澄清文本,因为您的帖子相当简洁。
  • 感谢您的评论,如果您允许,我会将您的评论包括在内,以便用户更清楚答案
  • 非常感谢,你真好。
猜你喜欢
  • 2017-06-14
  • 2012-02-03
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
  • 2011-10-23
  • 2013-02-13
  • 2017-08-17
相关资源
最近更新 更多