我正在构建一个Backbone.js应用程序,想知道在使用Backbone.jsp时,处理XSS和HTML转义的最佳方法是什么。
在官方Backbone.js文档中的基本Todos示例应用程序中,数据没有转义。由于该数据在模板中用于呈现todo条目,可以通过输入以下文本来执行Javascript代码(可以在上面的链接中复制):
"><script>alert('xss');</script>
当使用REST服务器作为存储后端时,此XSS对每个用户都是持久的。
你是如何解决这个问题的?
我的想法是对服务器上的数据进行转义,这样然后返回的数据就可以安全地用于模板中。那么,我是否必须始终使用wait: true
,以确保不呈现未缩放的数据?为了进行编辑,添加另一个具有未标注数据的属性,然后可以使用.val()
填充文本字段?
还是在呈现模板之前,不执行这些操作并转义客户端上的数据?
Todo示例不是最干净的示例。它使用下划线的模板引擎,如下所示:
<input class="edit" type="text" value="<%= title %>" />
要正确地转义HTML,请使用<%-
而不是<%=
:
<input class="edit" type="text" value="<%- title %>" />
主干网中的标准方法是使用model.escape(attribute)
。
来自主干文档backbonejs.org/#模型转义:
类似于get,但返回模型属性的HTML转义版本。如果将模型中的数据插入HTML,使用转义检索属性可以防止XSS攻击
var hacker = new Backbone.Model({
name: "<script>alert('xss')</script>"
});
alert(hacker.escape('name'));