0

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

生成的令牌标签如下所示:

<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,因此表面上这是可行的。

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

4

2 回答 2

2

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

$.ajaxSetup({
    data: {
        csrf_test_name: $("input[name='csrf_test_name']").val()
    }
});
于 2013-06-10T18:47:20.410 回答
1

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

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

$.ajaxSetup({ 'data': data });

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

于 2012-08-07T01:38:39.880 回答