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

设计师锦灏 阅读 14

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

我来解答 赞 2 收藏
二维码
手机扫码查看
1 条解答
迷人的慧慧
我之前也碰到过这情况,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误报,但得用证据去说服审计方。
点赞 4
2026-02-10 12:08