我今天正在阅读有关跨站点脚本(XSS)攻击的一些内容。似乎Backbone内置了model.escape('attr')
,而且我可以告诉我应该始终使用它而不是model.get('attr')
来防止这些攻击。
我做了一些初步搜索,但没有找到任何类型的推荐。从模型中检索值时,我应该始终使用model.escape('attr')
吗?
答案 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攻击。
请参阅此方法:
答案 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中指出的那样,在逃避属性之后检查属性的存在是没有意义的。