DAST扫描前端页面时为什么总报CSRF漏洞?

一鸣 阅读 58

我用 OWASP ZAP 做 DAST 扫描,每次扫我们 React 项目都提示 CSRF 漏洞,但我们根本没用表单提交,全是 fetch 请求,而且后端也校验了 token 啊。

尝试过在请求头加 X-CSRF-Token,也确认后端返回了正确的 cookie,但 ZAP 还是报。是不是 DAST 工具对 SPA 有误报?

这是我们的请求代码:

fetch('/api/update', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-CSRF-Token': getCsrfToken() // 从 meta 标签读取
  },
  credentials: 'include',
  body: JSON.stringify(data)
})
我来解答 赞 9 收藏
二维码
手机扫码查看
2 条解答
シ富水
シ富水 Lv1
这问题确实挺常见的,让我来帮你分析一下。DAST工具对SPA应用的CSRF检测确实容易误报,但咱们还是得从根儿上找原因。

首先,DAST扫描器主要是通过请求模式来判断是否存在CSRF漏洞,它可能没完全理解你这个fetch请求的防护机制。虽然你在header里加了 X-CSRF-Token,但扫描器可能认为这种前端注入header的方式不够安全。

这里有几个建议可以帮助你解决这个问题:

1. 确认你的csrf token验证逻辑在后端是有效的。我看到你是用 fetch 来发送请求的,确保 getCsrfToken() 这个函数确实能正确获取到token值:

function getCsrfToken() {
// 假设token存放在meta标签里
const csrfMeta = document.querySelector('meta[name="csrf-token"]');
return csrfMeta ? csrfMeta.getAttribute('content') : null;
}


2. 在后端除了校验token外,还要检查请求来源是否合法。比如可以加上对 Referer 或 Origin 头的验证:

if ($_SERVER['HTTP_ORIGIN'] !== 'https://your-frontend-domain.com') {
die('Invalid origin');
}


3. 如果ZAP还继续报错,你可以试试把 CSRF 防护策略改为双重验证:即在cookie中存放一个token,在请求头中也带上相同的token,后端同时验证这两个token是否匹配。

4. 最后,如果你确定代码没问题但ZAP一直报假阳性,可以在ZAP的规则设置里调整CSRF检测规则的阈值,或者直接忽略这条规则。

这里需要注意的是,CSRF防护不能只依赖单一手段,最好是多种方式结合使用。而且别忘了定期更新你的依赖包和框架版本,因为新的安全漏洞随时可能出现。

至于你说的“全是fetch请求”,其实不管是form表单还是fetch请求,都需要做CSRF防护。只是表单提交时比较容易被传统扫描器识别出来而已。
点赞
2026-03-27 22:05
Good“桂霞
懒人方案:ZAP 默认可能没识别出你的 token 验证逻辑,试试在 ZAP 的配置里手动设置忽略这个 URL 或者调整 CSRF 选项,让 ZAP 知道你已经在用 token 了。
点赞
2026-03-23 22:01