9

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 攻击技巧呢?

4

4 回答 4

15

为所有 jQuery.ajax 调用设置一个全局 CSRF-token:

$(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 在评论中指出的错字

于 2013-08-08T14:20:50.353 回答
4

您可以使用预过滤器将令牌添加到所有请求:

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

如果您不总是发送令牌,您可能需要添加额外的逻辑。

于 2013-08-08T11:34:30.327 回答
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
于 2015-08-25T14:17:46.503 回答
0

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

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

于 2015-06-23T05:17:12.900 回答