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

Posted

技术标签:

【中文标题】一般来说,在javascript中,使用innerHTML不是一个[in]安全问题吗?【英文标题】:in general, in javascript, isn't using innerHTML an [in]security issue? 【发布时间】:2015-05-27 09:23:45 【问题描述】:

使用DOMreactjs 等酷炫的新工具,innerhtml 是否应该在javascript 程序中使用?

使用它很像让自己面临 SQL 注入攻击,但在这里它是一个跨站点脚本等。在使用之前需要检查和清理所有内容。

在我看来 innerHTMLeval() 存在相同的安全问题,出于安全原因应避免使用。

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

【问题讨论】:

【参考方案1】:

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

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

但也有一些例外:

如果您使用的是自动为您处理 HTML 转义的客户端模板语言(例如带有 <%- 的 lodash 模板),将输出写入 innerHTML 是安全的。

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

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

【讨论】:

第一种和第三种情况是一样的:你依赖(别人的)代码清理器来保证你的安全。在降价的情况下,它似乎更像是一个错误而不是输出是 html 的功能。第二种情况似乎是浏览器异常:当前 html 文本的渲染速度比 DOM 操作更快,随着页面变得更加动态,这种情况应该会变得更好。

以上是关于一般来说,在javascript中,使用innerHTML不是一个[in]安全问题吗?的主要内容,如果未能解决你的问题,请参考以下文章

Vue之JavaScript基础

JavaScript ES6特性

SQL中inner join,outer join和cross join的区别

JavaScript中的作用域

SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)

cross apply 与 inner join 的区别