我今天正在阅读有关跨站点脚本 (XSS) 攻击的内容。似乎 Backbone 已经model.escape('attr')
内置,据我所知,应该始终使用它而不是model.get('attr')
防止这些攻击。
我做了一些初步搜索,但没有找到任何类似的建议。model.escape('attr')
从模型中检索值时我应该始终使用吗?
我今天正在阅读有关跨站点脚本 (XSS) 攻击的内容。似乎 Backbone 已经model.escape('attr')
内置,据我所知,应该始终使用它而不是model.get('attr')
防止这些攻击。
我做了一些初步搜索,但没有找到任何类似的建议。model.escape('attr')
从模型中检索值时我应该始终使用吗?
使用下划线模板,我通常看到/这样做是这样的:
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 %>
直接注入属性而不转义)。
而不是 model.escape(),请参阅渲染时的 _.escape。因此,您可以根据需要使用模型,但在渲染时要小心逃逸。渲染时在模板中使用 _.escape 就足够了。这避免了 XSS 攻击。
看这个方法:
是的,为了避免 xss 攻击,您可以始终使用 model.escape() ,这是更可取的,它也用于转义 html 内容......
但是,如果您要立即使用数据...您可以简单地使用 model.get()...
我找到了一篇关于何时使用主干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 在查询此问题的拉取报告中指出的那样,在转义属性后检查属性的存在是没有意义的。