如何阻止sanitize-html工具自动编码HTML实体?
解决方案
出现该问题的原因是sanitize-html默认开启了HTML特殊字符转义策略,即使配置allowedTags: []也会对&、<、>等HTML敏感字符做转义处理,避免输出内容直接嵌入HTML时出现安全风险,你的场景里属于原始内容已经做过一次转义,触发了二次转义导致&变成&。
方案1:直接关闭自动转义(推荐)
sanitize-html v2.7.0及以上版本支持通过escape配置项禁用全局转义,直接修改你的调用参数即可:
const sanitizeHtml = require('sanitize-html'); const TitleText = 'Nintendo & Microsoft & Sony'; console.log('Before', TitleText); const TitleTextSanitized = sanitizeHtml(TitleText, { allowedTags: [], escape: false // 关闭自动转义 }) console.log('After', TitleTextSanitized);
调用后输出的结果就会和原始输入一致,不会出现二次转义。
注意:关闭转义后如果后续需要将内容渲染到HTML页面,一定要在渲染阶段单独做转义处理,避免出现XSS安全漏洞。
方案2:清洗后做HTML实体解码
如果使用的sanitize-html版本不支持escape配置,可以在清洗完成后对结果做HTML实体解码,还原原始字符:
- 先安装实体处理工具
he
npm install he
- 修改代码如下:
const sanitizeHtml = require('sanitize-html'); const he = require('he'); const TitleText = 'Nintendo & Microsoft & Sony'; const TitleTextSanitized = he.decode(sanitizeHtml(TitleText, {allowedTags: []}));
内容的提问来源于stack exchange,提问作者volume one
相关产品推荐
相关产品推荐

