我在我的网站上启用了 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,因此表面上这是可行的。
我的问题是,这是一种安全的方法吗?是否可以遵循预期的最佳实践?我已经对此进行了一些谷歌搜索,似乎所有其他方法都更复杂,我想知道我的方式是否会创建一个我看不到/锻炼的攻击向量。