【发布时间】:2013-05-31 14:58:35
【问题描述】:
我一直在用 innerHTML 进行一些试验,试图找出我需要在我正在开发的 web 应用程序上加强安全性的地方,我在the mozilla docs 上遇到了一种我没有的有趣注入方法想了想。
var name = "<img src=x onerror=alert(1)>";
element.innerHTML = name; // Instantly runs code.
这让我想知道 a.) 我是否应该使用 innerHTML,以及 b.) 如果这不是问题,为什么我一直避免使用其他代码插入方法,尤其是 eval。
假设我在浏览器上运行 javascript 客户端,并且我正在采取必要的预防措施以避免在易于访问的函数中暴露任何敏感信息,并且我已经达到了一个任意指定的点,我已经决定 innerHTML 是不是安全风险,而且我已经优化了我的代码,以至于我不必担心性能受到非常小的影响......
使用 eval 是否会产生其他问题?除了纯代码注入还有其他安全问题吗?
或者,innerHTML 是我应该表现出同样关心的东西吗?是否同样危险?
【问题讨论】:
-
风险始终在于让一个用户生成的内容在另一个用户会话的上下文中运行。如果我编写一个脚本,在我自己的浏览器中运行它没什么大不了的,但如果该脚本被存储并在其他人的浏览器中运行,那是大不了的。
-
你问是否应该使用
innerHTML或eval,因为它们不相似 -
@ExplosionPills - 更多的是“我应该使用其中一个吗?”我想知道有什么区别。它们是纯粹类似的安全风险,还是其中一种风险比另一种风险更大?为什么?
-
@user2267361:
eval()的基线比innerHTML更危险。但是,如果您允许在innerHTML中插入script标记或事件处理程序,则基本上您已授予他们对eval的访问权限。 -
@apsillers:确实。我从来没有说过别的。脚本标记或事件处理程序.
标签: javascript html