一般来说,在 javascript 中,使用 innerHTML 不是一个 [in] 安全问题吗?
in general, in javascript, isn't using innerHTML an [in]security issue?
有了 DOM
和很酷的新工具,例如 reactjs
,innerHTML
应该在 javascript
程序中使用吗?
使用它很像向 SQL 注入攻击敞开大门,但这是一个跨站点脚本等。在使用之前需要检查和清除所有内容。
在我看来 innerHTML
具有与 eval()
相同的安全问题,出于 [in] 安全原因应避免使用。
(在美学上也是如此,但那只是我。)
是的,innerHTML
经常被滥用,并且是客户端 HTML 注入(DOM-XSS)安全漏洞的一个非常常见的来源。
通常使用对象样式的创建方法更好,例如createElement
、textContent
和直接设置DOM属性。类似地,在 jQuery 中,更喜欢使用 .text()
和 .prop()
而不是 .html()
来设置变量内容,或者将 HTML 标记传递给允许它的操作方法。
不过也有一些例外:
如果您使用的客户端模板语言会自动为您处理 HTML-转义(例如带有 <%-
的 lodash 模板),那么编写它是安全的输出到 innerHTML
.
如果您将很多同级附加到单个元素并且性能是优先考虑的(通常的示例是 <table>
具有大量行),HTML 创建标记是值得的,您只需要小心 HTML-手动转义所有文本
内容实际上应该是 HTML,例如您有从 Markdown 处理的数据。
有了 DOM
和很酷的新工具,例如 reactjs
,innerHTML
应该在 javascript
程序中使用吗?
使用它很像向 SQL 注入攻击敞开大门,但这是一个跨站点脚本等。在使用之前需要检查和清除所有内容。
在我看来 innerHTML
具有与 eval()
相同的安全问题,出于 [in] 安全原因应避免使用。
(在美学上也是如此,但那只是我。)
是的,innerHTML
经常被滥用,并且是客户端 HTML 注入(DOM-XSS)安全漏洞的一个非常常见的来源。
通常使用对象样式的创建方法更好,例如createElement
、textContent
和直接设置DOM属性。类似地,在 jQuery 中,更喜欢使用 .text()
和 .prop()
而不是 .html()
来设置变量内容,或者将 HTML 标记传递给允许它的操作方法。
不过也有一些例外:
如果您使用的客户端模板语言会自动为您处理 HTML-转义(例如带有
<%-
的 lodash 模板),那么编写它是安全的输出到innerHTML
.如果您将很多同级附加到单个元素并且性能是优先考虑的(通常的示例是
<table>
具有大量行),HTML 创建标记是值得的,您只需要小心 HTML-手动转义所有文本内容实际上应该是 HTML,例如您有从 Markdown 处理的数据。