为何客户端fetch触发CWE-918 SSRF告警?Semgrep扫描问题求助
解决Semgrep SAST触发的客户端SSRF(CWE-918)误报问题
首先明确:SSRF(服务端请求伪造)是服务端漏洞,核心是攻击者通过服务端发起未授权请求。你这段是客户端代码,运行在用户浏览器里,本身不存在SSRF风险——浏览器的同源策略会限制跨域请求,就算有攻击者想利用,也没法通过客户端请求攻击内部服务,所以这大概率是Semgrep的误报。
试试这几个解决办法:
直接给代码加Semgrep忽略注释
在fetch代码块上方加注释,告诉扫描器跳过这条规则检测:// nosemgrep: js.lang.security.audit.ssrf.ssrf const resp = await fetch(url, { method: "POST", headers: { Accept: "application/graphql-response+json; charset=utf-8, application/json; charset=utf-8", "Content-Type": "application/json", }, body: JSON.stringify({ query: request.text, variables, }), });彻底固化URL并加校验
把URL改成完全硬编码的后端地址,再加上域名校验逻辑,从根源上消除规则匹配的可能:// 硬编码合法的API域名 const ALLOWED_API_DOMAIN = "your-backend-domain.com"; const API_URL = `https://${ALLOWED_API_DOMAIN}/graphql`; // 额外的域名校验(可选,进一步加固) const targetUrl = new URL(API_URL); if (targetUrl.hostname !== ALLOWED_API_DOMAIN) { throw new Error("Invalid API endpoint"); } const resp = await fetch(targetUrl.toString(), { method: "POST", headers: { Accept: "application/graphql-response+json; charset=utf-8, application/json; charset=utf-8", "Content-Type": "application/json", }, body: JSON.stringify({ query: request.text, variables, }), });调整Semgrep全局配置
如果项目里客户端代码都不需要扫SSRF规则,可以在.semgrep.yml里加排除规则,避免误报:rules: - id: skip-client-ssrf-checks paths: exclude: - "src/client/**/*.js" - "src/**/*.jsx" # 适配React组件文件路径 rule: js.lang.security.audit.ssrf.ssrf mode: skip
之前你用硬编码URL、URL接口构造没解决,是因为Semgrep的SSRF规则可能只是简单匹配fetch调用的模式,没区分客户端还是服务端代码,所以得通过注释、配置排除或者更明确的固化逻辑来让扫描器识别这是安全的。
内容的提问来源于stack exchange,提问作者T. Junghans
相关产品推荐
相关产品推荐

