首页 文章

使用Backbone.js发布数据时如何防范CSRF?

提问于
浏览
9

Backbone.js处理将数据发布到服务器下的内容,因此没有简单的方法在有效负载中插入CSRF令牌 . 在这种情况下,如何保护我的网站免受CSRF的侵害?

在这个SO答案:https://stackoverflow.com/a/10386412/954376中,建议验证x-Requested-By标头是XMLHTTPRequest . 这足以阻止所有CSRF尝试吗?

在Django docs中,建议在每个AJAX请求中的另一个自定义头中添加CSRF令牌:https://docs.djangoproject.com/en/1.5/ref/contrib/csrf/#ajax . 这有必要吗?

我理解如果攻击使用隐藏形式,我只需确保请求来自XMLHTTPRequest即可 . 但是有没有可以伪造 Headers 的CSRF攻击技巧?

4 回答

  • 1

    您可以使用prefilter将令牌添加到所有请求:

    $.ajaxPrefilter(function(opts) {
        if (opts.data) {
            opts.data += "&";
        }
        opts.data += "csrfToken=" + token;
    });
    

    如果您不总是发送令牌,则可能需要添加其他逻辑 .

  • 0

    为所有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);
    };
    

    编辑:修复了评论中卡达姆指出的拼写错误

  • 15

    这是一个更新版本,基于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
    
  • 4

    我知道这是一个有点老问题,但我会留下一个链接到AMD模块的github repo只是为了这个:

    https://github.com/kuc2477/backbone.csrf.git(免责声明:我是该模块的作者)

相关问题