在 Angular2 应用程序中呈现用户内容的安全方法

Safe way to render user content in Angular2 app

我有两个 Angular 2 应用程序:一个供最终用户使用,一个供编辑团队使用。 都写在Javascript.

最终用户应用程序基本上是一个类似于 WhatsApp 的聊天视图,用户可以在其中与编辑团队进行一对一的聊天。编辑应用程序显示所有对话的列表,并且每个对话都有类似 WhatsApp 的聊天视图。

到目前为止,还不错。一切正常。但是,我有一个关于安全的问题。在第一个版本中,编辑应用程序中的消息内容是使用 innerHTML 语句呈现的:

<div [innerHTML]="message.data.text"></div>

然而,当用户滥用聊天输入字段并输入

message

时,将呈现此 HTML 语句,这是我们不希望看到的(因为它可能导致使用脚本标签等进行恶意尝试)。然而,我注意到 Angular2 足够聪明,不会呈现 JavaScript,但我不确定是否涵盖了每种代码注入。所以我将其更改为:

<div>{{ message.data.text }}</div>

这将忽略所有 HTML 并呈现

留言

这样做安全吗?或者还有一些罪魁祸首?我想解决这个问题的最好方法是在后端过滤掉所有不安全的输入(有可靠的方法吗?)

谢谢!

您应该尝试填写一个脚本标签,然后会发现它不再呈现,并在控制台中抛出警告。如果您使用 [innerHtml] 绑定并尝试创建一个 <input> 标签,情况也是如此。这也会失败。

To systematically block XSS bugs, Angular treats all values as untrusted by default. When a value is inserted into the DOM from a template, via property, attribute, style, class binding, or interpolation, Angular sanitizes and escapes untrusted value

阅读 angular 指南的 security 部分了解更多信息。

但是如果你真的不希望用户生成任何HTML,你应该总是使用插值绑定({{text}})。

内插内容总是被转义——HTML 不被解释并且浏览器在元素的文本内容中显示尖括号。

要解释 HTML,请将其绑定到 HTML 属性,例如 innerHTML。但是将攻击者可能控制的值绑定到 innerHTML 通常会导致 XSS 漏洞。