【问题标题】:Pass Codeigniter CSRF string to server via AJAX通过 AJAX 将 Codeigniter CSRF 字符串传递给服务器
【发布时间】:2012-07-07 09:16:46
【问题描述】:

我在我的网站上启用了 Codeigniter 的 CSRF 保护,该网站使用 AJAX 提交用户表单并处理需要通过 AJAX 提交数据的其他一些用户交互。结果,我遇到了“不允许操作”服务器端错误。我很快发现只有我的 javascript 通过 AJAX 收集和提交的数据被传递到服务器,因此没有发送 CSRF 代码。

生成的token标签如下:

<input type="hidden" name="csrf_test_name" value="dsflkabsdf888ads888XXXXXX" />

所以在我看来,将令牌提交到服务器进行验证的最简单方法是在 csrf_test_name 上使用 jQuery 选择器来获取值,然后将其添加到我的帖子数据中以供服务器验证。按照下面的代码:

//get CSRF token
var csrf = $('[name="csrf_test_name"]').val();

//build the form data array
var form_data = {
    csrf_test_name: csrf,
     ... ... ...
     ... ... ...
}

//send the form data to the server so it can be stored
$.ajax({
    type: "POST",
    data: form_data,
    url: ...,
    dataType: "html",
    success: function(msg){
         ... ... ...
    }//end success
});//end ajax

对于每次将数据发送到服务器的 ajax 提交,我都遵循此程序,并且服务器端错误已修复,一切正常。

为了测试这一点,我硬编码了一个不正确的 CSRF 令牌,服务器检测到不一致并返回错误代码 500,所以表面上这是可行的。

我的问题是,这是一种安全的方法吗?是否可以遵循预期的最佳做法?我已经对此进行了一些谷歌搜索,似乎所有其他方法都更复杂,我想知道我的方式是否会创建一个我看不到/锻炼的攻击向量。

【问题讨论】:

  • 我使用与您完全相同的方法,通常是推荐的方法。 AFIK 这是安全的,但我不介意对此有更多看法!
  • 这看起来还不错,除非您在后端代码中存在一些逻辑缺陷,这可能是不太可能的。我会确保当它们不匹配时你不会返回 500 错误,但我想这是一个偏好问题。还要记住,即使是最小的 XSS 也会在 10 次中有 9 次击败任何 csrf 保护。
  • 感谢您的反馈。我正在使用 Codeigniter 并且还启用了所有全局 XSS 过滤器,因此根据我对 Codeigniter 文档的理解,这应该可以阻止大多数攻击

标签: ajax security codeigniter csrf


【解决方案1】:

我喜欢将它添加到 Ajax 设置中。设置一次,它会自动将其添加到您所有请求的发布数据中。

$.ajaxSetup({
    data: {
        csrf_test_name: $("input[name='csrf_test_name']").val()
    }
});

【讨论】:

    【解决方案2】:

    一种更简单的方法是将该 csrf 传递给 $.ajaxSetup(),这样它就会包含在之后的任何 $.ajax() 请求中。

    var csrf = $('input[name="csrf_test_name"]').val();
    var data = {};
    data[CSRF] = csrf;
    
    $.ajaxSetup({ 'data': data });
    

    那么设置后就不需要在请求中包含data: { csrf_test_name: 'xxx', ... }了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-08
      • 1970-01-01
      • 2023-03-26
      • 2015-06-28
      • 2013-09-01
      • 2015-06-20
      • 2021-01-19
      相关资源
      最近更新 更多