如何用Google Caja sanitizer仅清理Node.js输入的JS代码并保留HTML字符?
嘿,针对你的问题,我来分享几个可行的方案~
解决方案:保留HTML标签仅清理JS相关内容
关于Google-Caja Sanitizer的适配
Google-Caja的默认行为确实会转义<和>这类HTML字符,因为它的核心设计是做严格的HTML sanitization。不过你可以通过自定义白名单规则来调整它的行为,实现保留合法HTML标签、仅过滤<script>/<style>和JavaScript函数的需求:
- 首先,明确指定允许的HTML标签(直接排除
script、style) - 严格禁止所有JavaScript相关的属性(比如
onclick、onload这类on*事件属性) - 注意:修改Caja的默认规则有一定复杂度,需要仔细配置避免安全漏洞,一旦规则疏漏可能让恶意代码有机可乘。
简单的Node.js使用示例(基于caja-sanitizer包):
const sanitize = require('caja-sanitizer').sanitize; // 自定义允许的标签和属性,完全排除JS相关内容 const customConfig = { allowedTags: ['p', 'div', 'span', 'a', 'img', 'b', 'i', 'ul', 'li'], // 根据你的业务需求添加标签 allowedAttributes: { 'a': ['href'], 'img': ['src', 'alt'] // 绝对不要添加任何on*属性 } }; // 注意:部分Caja版本可能需要调整内部过滤逻辑,才能避免合法标签被转义 const cleanedContent = sanitize(userInput, customConfig);
更推荐的Node/Express替代工具
相比调整Google-Caja,下面这两个工具更灵活易用,完全能满足你的需求,而且社区活跃度高、安全性有保障:
1. DOMPurify
这是目前最受欢迎的HTML sanitizer之一,支持高度自定义,能精准保留合法HTML同时过滤恶意内容:
const createDOMPurify = require('dompurify'); const { JSDOM } = require('jsdom'); // Node环境需要依赖jsdom初始化DOMPurify const window = new JSDOM('').window; const DOMPurify = createDOMPurify(window); // 配置:禁止script、style标签,以及所有JS事件属性 const cleanedInput = DOMPurify.sanitize(userInput, { FORBID_TAGS: ['script', 'style'], FORBID_ATTR: ['onclick', 'onload', 'onmouseover', 'onsubmit'] // 覆盖所有on*开头的属性 });
2. sanitize-html
这个库的API非常直观,配置起来快速上手,适合快速集成到Express项目中:
const sanitizeHtml = require('sanitize-html'); const cleanedInput = sanitizeHtml(userInput, { // 指定允许的标签(自动排除script、style) allowedTags: ['p', 'div', 'span', 'a', 'img', 'b', 'i', 'ul', 'li'], // 指定允许的属性,排除所有JS相关属性 allowedAttributes: { 'a': ['href'], 'img': ['src', 'alt'] }, // 禁止所有on*开头的事件属性 forbiddenAttributes: ['on*'] });
总结
如果一定要用Google-Caja,需要深入定制它的过滤规则,但过程相对繁琐;更推荐使用DOMPurify或sanitize-html,它们能更轻松地实现“保留正常HTML、仅清理JS相关内容”的需求,同时安全性更有保障。
内容的提问来源于stack exchange,提问作者Saravanan K
相关产品推荐
相关产品推荐

