DAST扫描前端页面时为什么总报CSRF漏洞?
我用 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)
})
首先,DAST扫描器主要是通过请求模式来判断是否存在CSRF漏洞,它可能没完全理解你这个fetch请求的防护机制。虽然你在header里加了 X-CSRF-Token,但扫描器可能认为这种前端注入header的方式不够安全。
这里有几个建议可以帮助你解决这个问题:
1. 确认你的csrf token验证逻辑在后端是有效的。我看到你是用 fetch 来发送请求的,确保 getCsrfToken() 这个函数确实能正确获取到token值:
2. 在后端除了校验token外,还要检查请求来源是否合法。比如可以加上对 Referer 或 Origin 头的验证:
3. 如果ZAP还继续报错,你可以试试把 CSRF 防护策略改为双重验证:即在cookie中存放一个token,在请求头中也带上相同的token,后端同时验证这两个token是否匹配。
4. 最后,如果你确定代码没问题但ZAP一直报假阳性,可以在ZAP的规则设置里调整CSRF检测规则的阈值,或者直接忽略这条规则。
这里需要注意的是,CSRF防护不能只依赖单一手段,最好是多种方式结合使用。而且别忘了定期更新你的依赖包和框架版本,因为新的安全漏洞随时可能出现。
至于你说的“全是fetch请求”,其实不管是form表单还是fetch请求,都需要做CSRF防护。只是表单提交时比较容易被传统扫描器识别出来而已。