SAST扫描总报React组件XSS漏洞,但代码明明转义了怎么办?

长孙奕冉 阅读 41

最近给React项目配置了SAST工具,扫描时总提示组件存在XSS风险。代码里已经用dangerouslySetInnerHTML包裹了sanitization函数处理的数据,为什么还是报这个漏洞?

我尝试过:

1. 在ESLint配置里添加react/no-danger例外规则

2. 在SAST工具规则文件里排除该组件路径

但扫描结果还是显示高危漏洞,难道是工具误报?或者转义方法没做到位?

具体代码片段:


render() {
  const sanitizedContent = DOMPurify.sanitize(this.props.userInput);
  return <div dangerouslySetInnerHTML={{__html: sanitizedContent}} />;
}

工具报的是第4行存在XSS风险,但DOMPurify明明是官方推荐的防护库啊…

我来解答 赞 13 收藏
二维码
手机扫码查看
2 条解答
设计师静依
SAST工具报React组件XSS漏洞,这个问题我也遇到过。确实容易让人困惑,因为用了DOMPurify处理内容,理论上应该是安全的。但SAST工具往往只看代码结构,不会动态判断你的处理逻辑是否可靠。

### 常见解决方案如下:

#### 1. **检查DOMPurify的版本和用法**
确保你用的是最新版DOMPurify,旧版本可能存在未修复的XSS处理缺陷。React官方推荐用法如下:

import DOMPurify from 'dompurify';

const sanitizedContent = DOMPurify.sanitize(this.props.userInput, { USE_PROFILES: { html: true } });


加上USE_PROFILES: { html: true }这个选项能进一步确保HTML内容被严格净化。

#### 2. **给SAST工具加注释说明**
有些SAST工具支持用注释跳过特定漏洞告警,例如:

// eslint-disable-next-line react/no-danger
return <div dangerouslySetInnerHTML={{ __html: sanitizedContent }} />;


如果是专用SAST工具(比如Checkmarx、SonarQube等),查一下它是否支持行级注释忽略规则。比如:

// nosem
return <div dangerouslySetInnerHTML={{ __html: sanitizedContent }} />;


#### 3. **在SAST配置里更精确地排除规则**
你提到在规则文件里排除了组件路径,但可能没生效。检查是否路径配置错误或优先级冲突。有些工具需要在配置中明确指定:

exclude:
- path: "**/components/YourComponent.js"
rules:
- xss


#### 4. **考虑改用React组件替代dangerouslySetInnerHTML**
如果只是展示用户输入的富文本,可以考虑用react-markdowndraft-js等库渲染内容,避免直接操作HTML。

---

如果你已经确认DOMPurify处理是安全的,那大概率是SAST误报。不过上线前最好让安全组确认一下这块逻辑,毕竟工具不理解你写的净化逻辑,只能靠人工兜底了。
点赞 5
2026-02-04 16:17
雯雯 Dev
SAST工具就是死脑筋,它只认代码形式不认逻辑。既然用了DOMPurify,就没问题,直接在扫描规则里加例外吧。

懒人方案:去SAST配置文件里,针对这个组件或这一行加个注释跳过规则,比如:
// SAST-ignore: XSS false positive - DOMPurify sanitization in use
const sanitizedContent = DOMPurify.sanitize(this.props.userInput);
return <div dangerouslySetInnerHTML={{__html: sanitizedContent}} />;


实在不行,把dangerouslySetInnerHTML换成普通文本渲染,虽然麻烦但能哄工具开心。
点赞 5
2026-01-30 22:08