如何在使用Backbone.js发布数据时防止CSRF

How to protect against CSRF when using Backbone.js to post data?

本文关键字:数据 CSRF 布数据 Backbone js      更新时间:2023-09-26

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(免责声明:我是模块的作者