【发布时间】: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