Angular项目已实现CSRF防护仍被OWASP ZAP报缺少Anti-CSRF令牌
OWASP ZAP扫描Angular+.NET Core应用误报缺少Anti-CSRF令牌的处理方案
问题表现
- 基于Angular 9 + .NET Core 3.1技术栈开发的应用,已完成CSRF防护功能开发,实际运行时防护逻辑工作正常
- 使用OWASP ZAP执行安全扫描后,累计触发30处「Absence of Anti-CSRF Tokens(缺少Anti-CSRF令牌)」告警
- 所有告警的定位来源均为Angular编译生成的静态脚本文件
vendor-es2015.js,甚至部分告警的触发点是该文件内的代码注释行 - 问题示例截图:

根本原因
该问题属于OWASP ZAP默认扫描规则的误报:
- ZAP的Anti-CSRF检测规则默认会遍历所有HTTP响应的文本内容,只要匹配到表单提交、状态修改请求相关的特征字符,就会判定当前响应缺少CSRF令牌,不会区分内容是实际业务逻辑、第三方依赖代码还是注释内容
vendor-es2015.js是Angular构建时打包生成的框架运行时+第三方依赖聚合静态文件,只会被浏览器下载执行,本身不具备接收用户状态修改请求的服务端能力,根本不需要携带CSRF令牌- 注释行触发告警的情况是误报的典型特征:注释内容不会被浏览器解析执行,不存在任何CSRF攻击面。
解决步骤
- 调整ZAP扫描规则,排除静态资源
在ZAP的上下文配置中,将静态资源路径加入CSRF检测规则的排除范围,需要排除的内容包括但不限于:
这类静态资源文件永远不会作为状态修改请求的接收端点,不需要做CSRF令牌校验。# Angular构建产物 /vendor-*.js /main-*.js /polyfills-*.js /runtime-*.js /styles-*.css # 通用静态资源 *.js *.css *.png *.jpg *.svg *.ico *.woff2 - 手动验证CSRF防护实际有效性
不要完全依赖自动扫描结果判定防护能力,手动验证三个核心逻辑即可确认防护生效:- 所有POST/PUT/DELETE/PATCH类状态修改请求,均正常携带预设的CSRF令牌字段
- 手动删除、篡改请求中的CSRF令牌后,后端接口会直接拒绝请求,返回400或403状态码
- 构造跨域站点模拟CSRF攻击场景,无有效令牌的请求无法完成业务操作
- 标记已有告警为误报
对已经生成的30条告警,在ZAP告警列表中统一标记为False Positive(误报),避免后续重复扫描时重复提示。
内容的提问来源于stack exchange,提问作者André Castro
相关产品推荐
相关产品推荐

