DOMPurify将<、>转义为&lt;除字符串替换外有什么解决方法?
DOMPurify
</>实体二次转义问题解决方案 你遇到的是DOMPurify默认开启的HTML实体二次编码策略导致的问题,该特性的设计初衷是避免攻击者利用多层实体编码绕过XSS检测,你目前想到的事后全局替换&lt;/&gt;的方案存在极高的安全风险,绝对不建议使用:如果攻击者构造&lt;script src=恶意脚本地址&gt;这类 payload,经过你的替换后会直接还原为可执行的<script>标签,完全突破DOMPurify的防护。
以下是两种安全的可替代方案:
方案一:调整DOMPurify配置(最便捷)
直接在调用sanitize方法时传入以下配置,即可合法保留<、>等文本实体不被二次转义,同时不会降低XSS防护等级:
const cleanContent = DOMPurify.sanitize(rawContent, { ALLOW_UNKNOWN_ENTITIES: true, ENCODE_ENTITIES: false })
该配置会让DOMPurify跳过对合法HTML实体的二次编码,同时仍然会严格过滤所有不在白名单内的标签、属性和恶意脚本。
方案二:自定义标记替换(最高安全性)
如果你担心修改全局编码配置会引入未知风险,可以用前后标记替换的方式处理,安全性远高于直接替换转义后的实体:
- 内容传入DOMPurify前,先将需要保留的文本实体替换为自定义的无风险标记:
let processed = rawContent.replace(/</g, '{{CUSTOM_LT}}').replace(/>/g, '{{CUSTOM_GT}}')
- 经过DOMPurify消毒后,再把自定义标记替换回原本的实体:
const cleanContent = DOMPurify.sanitize(processed).replace(/{{CUSTOM_LT}}/g, '<').replace(/{{CUSTOM_GT}}/g, '>')
这种方式不会意外还原任何恶意构造的标签实体,可控性最高。
内容的提问来源于stack exchange,提问作者melvin
相关产品推荐
相关产品推荐

