使用innerHTML防止脚本注入

时间:2012-06-04 20:29:35

标签: javascript innerhtml xss script-tag javascript-injection

我编写了一个微模板实用程序,它使用innerHTML根据用户输入(纯文本字符串或html字符串)在网页中注入html片段。

我主要担心的是恶意脚本注入的风险。脚本可以通过脚本标记或内联事件注入(例如img onload,div onmouseover)。

有没有办法清理html字符串以防止这种注入?另外,我应该注意其他脚本注入方法吗?

2 个答案:

答案 0 :(得分:4)

如果您想要安全,您将在客户端和服务器上清理模板。不要编写自己的反XSS库,因为恶意用户必然会知道您没有考虑到的漏洞;有太多的细微差别,除非你是XSS专家,否则你一定会错过一个。

在客户端,Google Caja有一个相当不错的HTML sanitization utility,可以对HTML字符串执行强大的清理,清理恶意属性或其他令人讨厌的用户可以执行令人讨厌的事情的区域,例如XSS攻击注入script标签。它们还会擦除属性和各种其他XSS注入点(例如objectapplet标记),因此您可以感觉相当安全。

虽然您应该在服务器上进行消毒以防止恶意用户简单地禁用javascript或覆盖Caja的消毒剂,但您可以使用Caja对输入和输出进行消毒,以尽可能多地捕获。

答案 1 :(得分:-2)

执行此操作的最简单方法(re:不健壮,有点hacky)是为您列出的案例编写特定的正则表达式替换:

el.innerHTML = htmlString.replace(/<script/gi, '&lt;script').replace(/\son[a-z]+=/gi, 'XXXX_BLOCKED=');

更强大的方法是实际解析潜在的HTML并删除令人讨厌的标签/属性并将其重新序列化为HTML然后将其设置为.innerHTML没有其他沙盒或建立在我所知的安全措施。希望这有助于确认