防止使用 innerHTML 进行脚本注入
Prevent script injection with innerHTML
我编写了一个微模板实用程序,它使用innerHTML根据用户输入(纯文本字符串或html字符串)在网页中注入html片段。
我主要担心的是恶意脚本注入的风险。脚本可以通过脚本标签或在内联事件(例如 img onload、div onmouseover)中注入。
有没有办法清理 html 字符串以防止此类注入?另外,我应该注意其他脚本注入方法吗?
为了安全起见,您需要在客户端和服务器上清理模板。不要编写自己的反 XSS 库,因为恶意用户必然知道您尚未考虑的漏洞;有太多的细微差别,除非您是XSS专家,否则您一定会错过一个。
在客户端,Google Caja有一个非常好的HTML清理实用程序,它将对HTML字符串执行强大的清理,清理恶意属性或其他讨厌用户可以做讨厌事情的区域,例如通过注入script
标签进行XSS攻击。它们还可以擦除属性和各种其他XSS注入点(例如object
和applet
标签),因此您可以感到相当安全。
虽然您应该在服务器上进行清理以防止恶意用户简单地禁用javascript或覆盖Caja的清理器,但您可以使用Caja清理输入和输出,以尝试尽可能多地捕获。
(前面有实验功能!要插入未经净化的 HTML,首选使用 Element.setHTML()
(来源:MDN)
元素接口的 setHTML() 方法用于解析和清理一个 HTML 字符串,然后将其作为子树插入到 DOM 中的元素。应该使用它而不是 Element.innerHTML 用于将不受信任的 HTML 字符串插入元素。
document.querySelector("#test").setHTML(someUnsanitizedString);
PS:兼容性通知:在 Chromium 浏览器中可用,但仍在 火狐 (2023.)
- 性能:动态脚本注入与服务器渲染脚本
- FireFox扩展对TinyMCE编辑器执行脚本注入
- 如何防止脚本注入
- 防止使用 innerHTML 进行脚本注入
- 如何将CSS样式应用于由Javascript脚本注入和样式化的HTML,这是我无法控制的
- 将内容脚本注入到不同扩展名的操作弹出窗口中的 iframe 中
- 交叉骑士 - 如何将脚本注入特定选项卡?以及如何重新加载特定选项卡
- BHO Internet Explorer插件-脚本注入问题
- 将脚本注入其他人的最简单方法是什么's域
- 获取当前活动的输入字段.Chrome内容脚本.脚本注入
- 在web上使用脚本注入的自动化测试
- Chrome扩展:连接"内容脚本"注入DOM
- 不能使用jquery访问通过Google chrome内容脚本注入的iframe内容
- 什么阻止Require'ed脚本注入更多的脚本标签?
- 跨站点脚本注入
- 为什么要在通过谷歌Chrome扩展将脚本注入预先存在的网页后删除脚本
- 如何对外部脚本注入依赖项
- Chrome扩展如何将我的内容脚本注入所有Facebook页面
- 使用java脚本注入另一个页面
- 如何在没有jQuery的情况下将脚本注入文档