4

我今天正在阅读有关跨站点脚本 (XSS) 攻击的内容。似乎 Backbone 已经model.escape('attr')内置,据我所知,应该始终使用它而不是model.get('attr')防止这些攻击。

我做了一些初步搜索,但没有找到任何类似的建议。model.escape('attr')从模型中检索值时我应该始终使用吗?

4

4 回答 4

5

使用下划线模板,我通常看到/这样做是这样的:

var TemplateHtml = "<div><%- someModelAttribute %></div>"; // Really, you should load from file using something like RequireJS

var View = Backbone.View.extend({
    _template: _.template(TemplateHtml),

    render: function() {
        this.$el.html(this._template(this.model.toJSON()));
    }
});

当您使用时<%- someModelAttribute %>,Underscore 知道要转义给定的值(而不是<%= someModelAttribute %>直接注入属性而不转义)。

于 2013-01-03T16:41:45.807 回答
3

而不是 model.escape(),请参阅渲染时的 _.escape。因此,您可以根据需要使用模型,但在渲染时要小心逃逸。渲染时在模板中使用 _.escape 就足够了。这避免了 XSS 攻击。

看这个方法:

http://underscorejs.org/#escape

于 2013-01-03T15:49:16.293 回答
1

是的,为了避免 xss 攻击,您可以始终使用 model.escape() ,这是更可取的,它也用于转义 html 内容......

但是,如果您要立即使用数据...您可以简单地使用 model.get()...

于 2013-01-03T15:38:25.090 回答
0

我找到了一篇关于何时使用主干escape功能的好文章。作者断言您应该始终使用转义,除非您绝对不会执行模型属性的值。例如,如果您正在检查模型属性 not null

var model = new Backbone.Model({foo: "Bar"});
if (model.get("foo") != null) { //notice how here we did not use escape
  $("h1").html(model.escape("foo")); //but here we do
}

需要注意的一个相关点是,如果您从中检查返回的值,model.escape("foo")它将始终返回一个字符串。因此,如果您期待null,那么您可能会感到困惑。

console.log(model.get("foo")); // null
console.log(model.escape("foo")); // ""

但是,正如 Jeremy Ashkenas 在查询此问题的拉取报告中指出的那样,在转义属性后检查属性的存在是没有意义的。

于 2014-08-01T07:05:49.733 回答