Backbone.js处理将数据发布到服务器下的内容,因此没有简单的方法在有效负载中插入CSRF令牌。在这种情况下,如何保护我的网站免受CSRF的侵害?
在这个SO答案:https://stackoverflow.com/a/10386412/954376中,建议将x-Requested-By标头验证为XMLHTTPRequest。这足以阻止所有CSRF尝试吗?
在Django文档中,建议在每个AJAX请求中的另一个自定义标头中添加CSRF令牌:https://docs.djangoproject.com/en/1.5/ref/contrib/csrf/#ajax。这有必要吗?
我理解如果攻击使用隐藏表单,我只需确保请求来自XMLHTTPRequest即可。但是有没有可以伪造标题的CSRF攻击技巧?
答案 0 :(得分:15)
为所有jQuery.ajax调用设置全局CSRF令牌:
$(function(){
$.ajaxSetup({
headers: {'X-CSRFToken': CSRF_TOKEN}
});
})
通过覆盖Backbone.sync来为Backbone设置令牌:
var oldSync = Backbone.sync;
Backbone.sync = function(method, model, options){
options.beforeSend = function(xhr){
xhr.setRequestHeader('X-CSRFToken', CSRF_TOKEN);
};
return oldSync(method, model, options);
};
编辑:修正了Kadam在评论中指出的拼写错误
答案 1 :(得分:4)
您可以使用prefilter将令牌添加到所有请求中:
$.ajaxPrefilter(function(opts) {
if (opts.data) {
opts.data += "&";
}
opts.data += "csrfToken=" + token;
});
如果您不总是发送令牌,则可能需要添加其他逻辑。
答案 2 :(得分:1)
这是一个更新版本,基于Django 1.7(使用jQuery cookie插件)
oldSync = Backbone.sync
Backbone.sync = (method, model, options) ->
csrfSafeMethod = (method) ->
# these HTTP methods do not require CSRF protection
/^(GET|HEAD|OPTIONS|TRACE)$/.test method
options.beforeSend = (xhr, settings) ->
if !csrfSafeMethod(settings.type) and !@crossDomain
xhr.setRequestHeader 'X-CSRFToken', $.cookie('csrftoken')
return
oldSync method, model, options
答案 3 :(得分:0)
我知道这是一个有点老问题,但我会留下一个链接到AMD模块的github repo只是为了这个:
https://github.com/kuc2477/backbone.csrf.git(免责声明:我是该模块的作者)