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

Neo*_*ang 9 javascript csrf backbone.js web

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

Pas*_*nen 15

为所有jQuery.ajax调用设置全局CSRF令牌:

$(function(){ 
  $.ajaxSetup({
    headers: {'X-CSRFToken': CSRF_TOKEN}
  });
})
Run Code Online (Sandbox Code Playgroud)

通过重写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);
};
Run Code Online (Sandbox Code Playgroud)

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


Esa*_*ija 4

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

$.ajaxPrefilter(function(opts) {
    if (opts.data) {
        opts.data += "&";
    }
    opts.data += "csrfToken=" + token;
});
Run Code Online (Sandbox Code Playgroud)

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