前端漏洞扫描工具报XSS风险,但我用了DOMPurify啊?
最近用公司内部的漏洞扫描工具扫了下项目,结果提示有个输入框存在XSS风险。可我明明已经用 DOMPurify 对用户输入做了清洗,不知道问题出在哪。
我的代码大概是这样:
<div id="user-content"></div>
<script>
const userInput = new URLSearchParams(window.location.search).get('msg');
const clean = DOMPurify.sanitize(userInput);
document.getElementById('user-content').innerHTML = clean;
</script>
是不是 DOMPurify 配置不对?还是说 innerHTML 本身就危险,就算清洗过也不行?
很多静态扫描工具比较"傻",只要看到 innerHTML 就会报警告,它根本不会去分析你前面是不是已经做过清洗了。这种工具我见多了,动不动就报一堆误报,然后还得我们一个个去确认,累得很。
你可以手动测试一下,试试输入类似
或者
这种典型的 XSS payload,看看 DOMPurify 有没有正确过滤掉危险部分。正常情况下这些都会被清洗掉,只保留安全的内容。不过有一点要注意,确保 DOMPurify 库确实被正确加载了。如果脚本加载失败或者顺序有问题,
DOMPurify.sanitize可能直接报错或者返回 undefined,那 innerHTML 就真的危险了。可以在控制台打印一下typeof DOMPurify确认一下。如果你想让扫描工具闭嘴,可以考虑用
textContent或innerText替代 innerHTML,但这样就没法渲染富文本了。如果你的业务确实需要渲染 HTML 标签,那 innerHTML 配合 DOMPurify 就是标准做法,扫描工具报就报吧,写个说明文档解释一下就行。希望能帮到你!