前端怎么防范XSS攻击?我用了DOMPurify还是被绕过了?
我在项目里引入了 DOMPurify 来过滤用户输入,但安全测试时还是报了 XSS 漏洞。比如用户提交的内容里有 <img src=x onerror=alert(1)>,明明应该被过滤掉,结果在某些页面还是能执行。
我检查了代码,是这样用的:
const clean = DOMPurify.sanitize(dirtyInput, {
ALLOWED_TAGS: ['p', 'br', 'strong'],
ALLOWED_ATTR: ['class']
});
element.innerHTML = clean;
是不是配置有问题?还是说这种场景根本不能用 innerHTML?现在有点懵,不知道该怎么改才安全。
1. 确认DOMPurify版本是否最新,老版本确实可能有绕过漏洞
2. 尝试加上FORBID_TAGS和FORBID_ATTR配置,比只允许白名单更保险:
3. 更安全的做法是放弃innerHTML,改用textContent。除非你真的需要渲染HTML标签,否则纯文本展示最安全:
4. 如果必须用HTML,建议在服务器端也做一次过滤,不要完全依赖前端
我碰到过类似问题,最后发现是第三方库动态插入DOM时没走过滤流程。可以检查下是否有其他代码绕过你的过滤逻辑直接操作DOM。
另外注意下,如果用户输入最终是要插入到模板字符串里,比如
,这种也需要提前过滤,不然照样会被执行。${userInput}