You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DOMPurify将<、>转义为<除字符串替换外有什么解决方法?

DOMPurify </>实体二次转义问题解决方案

你遇到的是DOMPurify默认开启的HTML实体二次编码策略导致的问题,该特性的设计初衷是避免攻击者利用多层实体编码绕过XSS检测,你目前想到的事后全局替换&amp;lt;/&amp;gt;的方案存在极高的安全风险,绝对不建议使用:如果攻击者构造&amp;lt;script src=恶意脚本地址&amp;gt;这类 payload,经过你的替换后会直接还原为可执行的<script>标签,完全突破DOMPurify的防护。

以下是两种安全的可替代方案:

方案一:调整DOMPurify配置(最便捷)

直接在调用sanitize方法时传入以下配置,即可合法保留<、>等文本实体不被二次转义,同时不会降低XSS防护等级:

const cleanContent = DOMPurify.sanitize(rawContent, {
  ALLOW_UNKNOWN_ENTITIES: true,
  ENCODE_ENTITIES: false
})

该配置会让DOMPurify跳过对合法HTML实体的二次编码,同时仍然会严格过滤所有不在白名单内的标签、属性和恶意脚本。

方案二:自定义标记替换(最高安全性)

如果你担心修改全局编码配置会引入未知风险,可以用前后标记替换的方式处理,安全性远高于直接替换转义后的实体:

  1. 内容传入DOMPurify前,先将需要保留的文本实体替换为自定义的无风险标记:
let processed = rawContent.replace(/&lt;/g, '{{CUSTOM_LT}}').replace(/&gt;/g, '{{CUSTOM_GT}}')
  1. 经过DOMPurify消毒后,再把自定义标记替换回原本的实体:
const cleanContent = DOMPurify.sanitize(processed).replace(/{{CUSTOM_LT}}/g, '&lt;').replace(/{{CUSTOM_GT}}/g, '&gt;')

这种方式不会意外还原任何恶意构造的标签实体,可控性最高。

内容的提问来源于stack exchange,提问作者melvin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 09:15:06