Nessus扫描显示React组件存在XSS漏洞,但代码已经过滤输入了怎么办?
大家好,我在用Nessus扫描公司前端项目时,发现一个React组件被标记为XSS漏洞。但代码明明已经用了DOMPurify过滤输入,这是怎么回事?
我的代码是这样的:
import DOMPurify from 'dompurify';
function Comment({ content }) {
const sanitized = DOMPurify.sanitize(content);
return <div dangerouslySetInnerHTML={{ __html: sanitized }} />;
}
我已经尝试过以下方法:
1. 确认DOMPurify版本是最新版2.4.0
2. 手动添加了转义处理:replace(/</g, '<')
3. 检查了所有输入来源是否都经过处理
但Nessus仍然报告该组件存在反射型XSS漏洞。测试人员用 payloads测试时,控制台确实没有执行脚本,但工具还是显示漏洞存在。这到底是工具误报,还是哪里没过滤到位?
首先你的代码逻辑没错,用 DOMPurify 加上 dangerouslySetInnerHTML 是常规做法。不过有个细节需要注意:DOMPurify 的配置选项可能会影响过滤效果。
建议你在 sanitize 时加上配置:
这个配置禁止了所有标签和一些常见的危险属性。我当时就是加了这些配置才解决类似问题的。
另外检查下 content 数据来源,有时候后端传过来的数据可能包含了一些特殊字符或编码方式,导致 DOMPurify 没能完全清理干净。我一般会在服务端也做一次简单过滤,比如用 html_entities 库转义一下特殊字符。
最后如果确定是工具误报,可以给安全团队提供详细的测试报告说明情况。毕竟我们开发者也要保护自己,免得背锅。
总之先试试这几个方法,应该能解决问题。这玩意真折腾人,理解你的心情。
你的写法本身没问题,DOMPurify + dangerouslySetInnerHTML是React里处理富文本的标准做法。但扫描器不懂这个,它看到的是“用户输入 content 出现在了页面中”,然后就报警了。
你可以这么处理:
第一,确认DOMPurify真的生效了。加个测试用例,比如传入
第二,检查是不是有其他路径绕过了净化。比如content有没有可能在别的地方被拼进字符串再渲染?或者有没有服务端直接吐HTML的情况?Nessus可能是在测后端接口。
第三,如果确认前端没问题,那就是误报。你需要整理测试证据:比如截图显示payload没执行、DOMPurify的输出日志、请求响应体里的内容。拿这些去跟安全团队沟通,说明这是工具的误判。
另外建议加一层防御,比如给DOMPurify配配置:
限制只允许最基本的标签,进一步降低风险。
总结:你代码没问题,大概率是Nessus误报,但得用证据去说服审计方。