25

我正在构建一个 Backbone.js 应用程序,并且想知道在使用 Backbone.js 时处理 XSS 和 HTML 转义的最佳方法是什么。

在来自官方 Backbone.js 文档的基本Todos 示例应用程序中,数据没有转义。由于此数据在模板中用于呈现待办事项条目,因此可以通过输入以下文本来执行 Javascript 代码(可以在上面的链接中复制):

"><script>alert('xss');</script>

当使用 REST 服务器作为存储后端时,这个 XSS 对每个用户都是持久的。

你怎么解决这个问题?

我的想法是转义服务器上的数据,因此返回的数据可以安全地在模板中使用。那么我是否必须始终使用wait: true, 以确保没有呈现未转义的数据?对于编辑,添加另一个带有未转义数据的属性,然后可以使用它来填充文本字段.val()

或者在渲染模板之前,您是否不执行这些操作并转义客户端上的数据?

4

2 回答 2

50

Todo 示例不是最简洁的示例。它使用下划线的模板引擎,如下:

<input class="edit" type="text" value="<%= title %>" />

要正确转义 HTML,请使用<%-代替<%=

<input class="edit" type="text" value="<%- title %>" />
于 2012-09-25T16:26:01.800 回答
2

骨干网的标准方法是使用model.escape(attribute).

从骨干文档backbonejs.org/#Model-escape

“与 get 类似,但返回模型属性的 HTML 转义版本。如果要将模型中的数据插入 HTML,使用转义检索属性将防止 XSS 攻击。”

var hacker = new Backbone.Model({
    name: "<script>alert('xss')</script>"
});

alert(hacker.escape('name'));
于 2015-08-02T03:31:09.897 回答