Nessus扫描显示React组件存在XSS漏洞,但代码已经过滤输入了怎么办?

设计师锦灏 阅读 43

大家好,我在用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测试时,控制台确实没有执行脚本,但工具还是显示漏洞存在。这到底是工具误报,还是哪里没过滤到位?

我来解答 赞 4 收藏
二维码
手机扫码查看
2 条解答
FSD-路阳
这个问题我也遇到过,当时卡在这好几天。Nessus这种扫描工具有时候确实会误报,但也不能完全排除问题。

首先你的代码逻辑没错,用 DOMPurify 加上 dangerouslySetInnerHTML 是常规做法。不过有个细节需要注意:DOMPurify 的配置选项可能会影响过滤效果。

建议你在 sanitize 时加上配置:

const sanitized = DOMPurify.sanitize(content, {
ALLOWED_TAGS: [],
FORBID_ATTR: ['on*', 'style']
});


这个配置禁止了所有标签和一些常见的危险属性。我当时就是加了这些配置才解决类似问题的。

另外检查下 content 数据来源,有时候后端传过来的数据可能包含了一些特殊字符或编码方式,导致 DOMPurify 没能完全清理干净。我一般会在服务端也做一次简单过滤,比如用 html_entities 库转义一下特殊字符。

最后如果确定是工具误报,可以给安全团队提供详细的测试报告说明情况。毕竟我们开发者也要保护自己,免得背锅。

总之先试试这几个方法,应该能解决问题。这玩意真折腾人,理解你的心情。
点赞
2026-03-30 13:02
迷人的慧慧
我之前也碰到过这情况,Nessus这种工具对React的dangerouslySetInnerHTML特别敏感,就算你用了DOMPurify也会报。问题不在你代码逻辑,而在于扫描器根本不理解你在JS里做了净化,它只看请求参数有没有直接出现在响应HTML里,只要有就标XSS。

你的写法本身没问题,DOMPurify + dangerouslySetInnerHTML是React里处理富文本的标准做法。但扫描器不懂这个,它看到的是“用户输入 content 出现在了页面中”,然后就报警了。

你可以这么处理:

第一,确认DOMPurify真的生效了。加个测试用例,比如传入 ,看页面是否真的没执行脚本。你已经试过控制台没输出,说明大概率是安全的。

第二,检查是不是有其他路径绕过了净化。比如content有没有可能在别的地方被拼进字符串再渲染?或者有没有服务端直接吐HTML的情况?Nessus可能是在测后端接口。

第三,如果确认前端没问题,那就是误报。你需要整理测试证据:比如截图显示payload没执行、DOMPurify的输出日志、请求响应体里的内容。拿这些去跟安全团队沟通,说明这是工具的误判。

另外建议加一层防御,比如给DOMPurify配配置:

const sanitized = DOMPurify.sanitize(content, {
ALLOWED_TAGS: ['b', 'i', 'em', 'strong', 'p', 'br'],
FORBID_TAGS: ['script', 'iframe', 'object', 'embed']
});


限制只允许最基本的标签,进一步降低风险。

总结:你代码没问题,大概率是Nessus误报,但得用证据去说服审计方。
点赞 6
2026-02-10 12:08