Backbone:应该使用model.escape而不是model.get吗?

时间:2013-01-03 15:33:15

标签: javascript backbone.js xss

我今天正在阅读有关跨站点脚本(XSS)攻击的一些内容。似乎Backbone内置了model.escape('attr'),而且我可以告诉我应该始终使用它而不是model.get('attr')来防止这些攻击。

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

4 个答案:

答案 0 :(得分:5)

使用Underscore模板,我一般都看到/做过这样的事情:

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 %>)。

答案 1 :(得分:3)

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

请参阅此方法:

http://underscorejs.org/#escape

答案 2 :(得分:1)

是的,为了避免xss攻击你可能总是使用model.escape()这是更好的,它也用于转义html内容......

但是如果你要立即使用数据......你可以简化使用model.get()......

答案 3 :(得分:0)

我找到了good article on when to use the backbone escape function。作者声称你应该总是使用转义,除非你肯定不会执行模型属性的值。例如,如果您正在检查模型属性不是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在pull report querying this issue中指出的那样,在逃避属性之后检查属性的存在是没有意义的。