DOMPurify 清洗后为啥还是能执行 XSS? 宇文慧娜 提问于 2026-02-25 08:37:16 阅读 44 安全 我用 DOMPurify 处理用户输入的 HTML,但发现某些脚本居然还能执行,是不是我用错了? 比如这段代码: const dirty = '<img src=x onerror=alert(1)>'; const clean = DOMPurify.sanitize(dirty); document.getElementById('output').innerHTML = clean; 按理说 onerror 应该被过滤掉才对,但页面一加载弹窗就出来了,这正常吗? Web安全 我来解答 赞 18 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 2 条解答 FSD-洋洋 Lv1 啊这个情况我遇到过,DOMPurify默认配置确实可能会漏掉一些XSS。问题出在默认情况下它允许onerror这种属性存在。 安全建议是加上严格配置参数: const clean = DOMPurify.sanitize(dirty, { FORBID_TAGS: ['img'], FORBID_ATTR: ['onerror'] }); 其实更保险的做法是直接禁用所有内联事件处理: const clean = DOMPurify.sanitize(dirty, { ADD_ATTR: ['target'], ADD_TAGS: ['iframe'], FORBID_ATTR: ['on*'] // 禁止所有on开头的属性 }); 顺便吐槽下,前端安全真是防不胜防,上周我还在和这种注入问题搏斗到凌晨3点... 建议做完处理后用类似console.log(clean)检查下输出内容,确认没有残留的危险属性。 另外记得永远不要直接信任前端验证,后端必须再做一次清洗。 回复 点赞 2026-03-05 23:09 爱学习的诗诗 Lv1 应该是你没传配置对象进去,DOMPurify 默认只对 HTML 字符串做基础清洗,但如果你的输入是已经解析过的 DOM 节点(比如浏览器自动解析了 HTML 实体),它就不会二次处理。你这段代码里 <img src=x onerror=alert(1)> 实际上会被浏览器当作纯文本,但如果你是用 innerHTML 插入字符串,它会触发 HTML 解析,而 DOMPurify 需要你显式告诉它「这是原始 HTML 字符串」——不过你这段其实没问题,真正的问题是:你是不是在别的地方又把 clean 当作 HTML 再次解析了?比如用 eval 或 new Function? 最可能的原因是你把 clean 用 innerHTML 插入后,浏览器又重新解析了一次,而 DOMPurify 只清洗了一次。 修复方案:直接用 textContent 或者确保只插入一次,或者加上 {RETURN_TRUSTED_TYPE: true} 配置避免二次解析: const dirty = '<img src=x onerror=alert(1)>'; const clean = DOMPurify.sanitize(dirty, {RETURN_TRUSTED_TYPE: true}); document.getElementById('output').innerHTML = clean; 回复 点赞 4 2026-02-25 08:42 加载更多 相关推荐 1 回答 61 浏览 前端怎么防范XSS攻击?我用了DOMPurify还是被绕过了? 我在项目里引入了 DOMPurify 来过滤用户输入,但安全测试时还是报了 XSS 漏洞。比如用户提交的内容里有 <img src=x onerror=alert(1)>,明明应该被过滤掉... 技术若溪 安全 2026-03-09 19:29:21 2 回答 48 浏览 前端漏洞扫描工具报XSS风险,但我用了DOMPurify啊? 最近用公司内部的漏洞扫描工具扫了下项目,结果提示有个输入框存在XSS风险。可我明明已经用 DOMPurify 对用户输入做了清洗,不知道问题出在哪。 我的代码大概是这样: <div id="us... 振莉 Dev 前端 2026-02-28 20:08:20 1 回答 38 浏览 富文本编辑器怎么防XSS攻击? 我在项目里用了富文本编辑器,用户可以贴各种HTML内容,但担心被XSS注入。试过用DOMPurify.sanitize()处理,但有些样式会被干掉,客户不接受。 有没有既能保留合理标签(比如<b... シ紫瑶 安全 2026-03-26 16:30:26 2 回答 79 浏览 前端如何防止XSS攻击?我用了转义还是被绕过了? 最近在做用户评论功能,后端返回的评论内容里可能包含用户输入的HTML,我用DOMPurify.sanitize()处理了,但测试时发现还是能插入脚本,是不是我用法不对? 比如下面这段代码,我以为会被过... 丽苹 Dev 前端 2026-03-14 22:01:19 2 回答 103 浏览 设置了X-XSS-Protection头还是被Chrome提示XSS防护已禁用? 最近在配置安全头的时候发现了个怪事,明明在Express里设置了X-XSS-Protection: 1; mode=block,但Chrome控制台还是弹出“XSS 防护已禁用”的警告,这是怎么回事啊... 春萍酱~ 安全 2026-02-18 12:01:29 2 回答 80 浏览 CSS样式中的expression()如何绕过事件属性过滤导致XSS? 我在开发评论系统时发现,即使过滤了所有on开头的事件属性,用户提交的CSS代码还是能触发XSS。比如有人写了个这样的样式: div { width: expression(alert('XSS'));... 打工人尚勤 安全 2026-02-12 21:11:25 1 回答 64 浏览 白盒测试时怎么判断前端代码是否存在XSS风险? 最近在做项目安全自查,听说白盒测试要查XSS漏洞,但我看自己写的React组件里都是用{userInput}这种插值,应该没问题吧?可又不确定有没有漏掉什么场景。 比如有个地方用了dangerousl... 设计师丽丽 安全 2026-03-31 04:19:14 1 回答 51 浏览 DAST扫描报React应用有XSS漏洞,但我用了JSX不是自动转义了吗? 我们最近用OWASP ZAP做DAST安全扫描,结果报了一个反射型XSS漏洞。可我明明在React里直接用JSX渲染用户输入,按理说React会自动转义啊,怎么还会被扫出来? 比如下面这段代码,只是把... 欧阳东宁 安全 2026-03-30 21:17:16 1 回答 81 浏览 AppScan 扫出 Vue 项目 XSS 漏洞怎么修复? 最近用 AppScan 扫我们 Vue 项目,报了个反射型 XSS 高危漏洞,说是在路由参数没过滤。但我明明用的是 Vue Router,参数都是通过 this.$route.query 拿的,页面上... 司徒子聪 安全 2026-03-30 11:34:17 2 回答 51 浏览 前端如何用安全沙箱防止XSS攻击? 最近在做一个富文本编辑器的功能,用户可以输入HTML内容,但我担心XSS问题。听说可以用沙箱隔离,比如把内容放到iframe里?我试过动态创建iframe然后写入内容,但样式全乱了,而且有些脚本还是能... UP主~静静 安全 2026-03-27 18:24:25
onerror这种属性存在。安全建议是加上严格配置参数:
其实更保险的做法是直接禁用所有内联事件处理:
顺便吐槽下,前端安全真是防不胜防,上周我还在和这种注入问题搏斗到凌晨3点... 建议做完处理后用类似
console.log(clean)检查下输出内容,确认没有残留的危险属性。另外记得永远不要直接信任前端验证,后端必须再做一次清洗。
<img src=x onerror=alert(1)>实际上会被浏览器当作纯文本,但如果你是用innerHTML插入字符串,它会触发 HTML 解析,而 DOMPurify 需要你显式告诉它「这是原始 HTML 字符串」——不过你这段其实没问题,真正的问题是:你是不是在别的地方又把clean当作 HTML 再次解析了?比如用eval或new Function?最可能的原因是你把
clean用innerHTML插入后,浏览器又重新解析了一次,而 DOMPurify 只清洗了一次。修复方案:直接用
textContent或者确保只插入一次,或者加上{RETURN_TRUSTED_TYPE: true}配置避免二次解析: