一般来说,在 javascript 中,使用 innerHTML 不是一个 [in] 安全问题吗?

in general, in javascript, isn't using innerHTML an [in]security issue?

有了 DOM 和很酷的新工具,例如 reactjsinnerHTML 应该在 javascript 程序中使用吗?

使用它很像向 SQL 注入攻击敞开大门,但这是一个跨站点脚本等。在使用之前需要检查和清除所有内容。

在我看来 innerHTML 具有与 eval() 相同的安全问题,出于 [in] 安全原因应避免使用。

(在美学上也是如此,但那只是我。)

是的,innerHTML 经常被滥用,并且是客户端 HTML 注入(DOM-XSS)安全漏洞的一个非常常见的来源。

通常使用对象样式的创建方法更好,例如createElementtextContent和直接设置DOM属性。类似地,在 jQuery 中,更喜欢使用 .text().prop() 而不是 .html() 来设置变量内容,或者将 HTML 标记传递给允许它的操作方法。

不过也有一些例外:

  • 如果您使用的客户端模板语言会自动为您处理 HTML-转义(例如带有 <%- 的 lodash 模板),那么编写它是安全的输出到 innerHTML.

  • 如果您将很多同级附加到单个元素并且性能是优先考虑的(通常的示例是 <table> 具有大量行),HTML 创建标记是值得的,您只需要小心 HTML-手动转义所有文本

  • 内容实际上应该是 HTML,例如您有从 Markdown 处理的数据。