如何在使用Backbone.js发布数据时防止CSRF
How to protect against CSRF when using Backbone.js to post data?
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有什么攻击技巧可以伪造标题吗?
为所有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在评论
您可以使用预过滤器将令牌添加到所有请求中:
$.ajaxPrefilter(function(opts) {
if (opts.data) {
opts.data += "&";
}
opts.data += "csrfToken=" + token;
});
如果您不总是发送令牌,则可能需要添加额外的逻辑。
这是一个更新版本,基于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
我知道这是一个有点老的问题,但我会留下一个链接到AMD模块的github回购:
https://github.com/kuc2477/backbone.csrf.git(免责声明:我是模块的作者)
相关文章:
- 用程序搜索JQuery数据表中的文本
- 要求输入在数据列表中
- 正在将数据主题添加到所有项目
- 函数参数中的数据与指定变量之间的任何性能差异
- 在VanillaJS中模拟模型双向数据绑定
- CSS-如何定位内容数据标题
- 使用电话间隙在Android应用程序中显示SQL Lite的数据
- 无法在数据endVal中设置值=“”;{{ucount}}”;使用Angular JS的CountUp
- 序列化数据属性中对象的最可靠方法
- 如何将JSON数据导入我的ejs模板
- 不显示带有本地json文件数据的谷歌地图脚本
- 如何将json数据显示为html
- 画布数据到图像
- 使用jquery将mysql数据获取到新的表行中
- 使用html中的外部javascript进行数据验证
- 有时数据是't显示在浏览器中
- React中的数据集表示
- 当数据达到一定数量时,CSRF 问题就会出现
- CSRF - 伪造的 POST 可以包含任意数据吗?
- 如何在使用Backbone.js发布数据时防止CSRF