为什么OWASP ZAP无法拦截Angular应用的某些AJAX请求?

萌新.艳珂 阅读 38

我在用OWASP ZAP测试Angular项目时发现,虽然设置了代理8080,大部分请求都能拦截,但文件上传和实时搜索的两个AJAX请求完全没反应。用F12看网络面板明明有这些请求,ZAP里却显示空白,提示”Connection reset by peer”。已经试过右键”Add to Allowed List”和修改context排除规则,但还是不行。

这两个接口用的是FormData和WebSocket混合传输,配置文件里有这样设置代理:
npm start -- --proxy http://localhost:8080

奇怪的是在ZAP的Access Control里看到OPTIONS请求被自动放过,但POST请求就是拦截不到。是不是和Angular的CORS预检机制有关?或者需要特殊配置拦截WebSocket?

我来解答 赞 5 收藏
二维码
手机扫码查看
2 条解答
a'ゞ树涵
你这个问题很典型,Angular的HTTP请求默认是走的浏览器通道,而OWASP ZAP作为代理拦截工具,在某些情况下会因为浏览器本身的机制绕过拦截,尤其是涉及到CORS和WebSocket的场景。

首先,你npm start的时候设置的代理只是开发代理,它只对你的Angular应用发起的HTTP请求起作用,对浏览器底层的OPTIONS、WebSocket、Preflight等请求是不起作用的。ZAP拦截不到POST,很可能是因为CORS预检(OPTIONS)通过后,浏览器直接放行了后续请求,没有走ZAP代理通道。

其次,你提到的WebSocket混合传输,这玩意本身就是异步通道,ZAP默认不拦截WebSocket流量,需要手动开启:

进入ZAP的菜单:
Tools → Options → WebSocket → 勾选“Enable WebSocket proxying”

然后,你还需要在ZAP的“Sites”节点下,找到WebSocket的流量,才能看到握手和后续消息。

另外,ZAP默认会放过OPTIONS请求,这个行为可以通过拦截规则调整。你可以在ZAP的“Options” → “Behavior” → “Passive scanner”里,取消勾选“Skip OPTIONS requests”。

还有一个可能:Angular在发送FormData的时候,会自动带上Content-Type: multipart/form-data,某些代理设置不识别这玩意,会导致连接被重置。你可以尝试用浏览器插件(比如ModHeader)伪造Content-Type,或者换用Burp Suite看看是否能正常拦截。

总之,这不是Angular的问题,是代理链和浏览器安全策略配合的坑,后端处理不了,只能从前端测试方式和ZAP配置上调整。
点赞 5
2026-02-05 11:26
国娟 Dev
Angular应用配合OWASP ZAP测试时,对于某些AJAX请求(如文件上传、WebSocket通信等)无法正常拦截,这通常涉及CORS预检、代理配置或协议支持问题。以下是可能的解决办法:

### 1. **确认Angular代理是否绕过了ZAP**
你在启动命令中用了:
npm start -- --proxy http://localhost:8080

这个代理是Angular DevServer的配置,它虽然能转发请求,但**不会强制所有流量走ZAP**。某些请求(比如上传大文件)可能被Angular底层库直接发送,绕过了代理机制。
**解决方法:**
- 不要依赖Angular的代理,改用系统级代理设置,确保所有HTTP流量经过ZAP。
- 或者用浏览器插件(如SwitchyOmega)将请求显式指向ZAP的监听地址。

---

### 2. **处理CORS预检(OPTIONS)请求**
ZAP默认会放过某些OPTIONS请求,尤其是当它无法匹配到上下文或安全策略较严格时。
**解决方法:**
- 进入ZAP的Options > Allowed Domains,确保目标域名被加入白名单。
- 勾选Handle CORS pre-flight requests选项,让ZAP正确处理OPTIONS请求。
- 可以临时关闭Anti-CSRF Protection等安全策略,看看是否是它们阻止了请求。

---

### 3. **WebSocket请求默认不会被拦截**
ZAP默认**不主动拦截WebSocket流量**,除非你手动启用相关功能。
**解决方法:**
- 进入ZAP的Options > WebSocket设置页,勾选Enable WebSocket proxying
- 确保你的Angular应用连接的是ws://localhost:8080/...,而不是直接绕过ZAP连接后端。

---

### 4. **排除Connection reset错误**
如果ZAP提示"Connection reset by peer",说明ZAP尝试拦截但握手失败,常见原因包括:
- 客户端或服务端SSL配置问题(比如不支持ZAP的中间证书)。
- 后端拒绝了ZAP代理的连接(比如未正确信任ZAP的CA证书)。

**解决方法:**
- 确保浏览器或系统中信任了ZAP的CA证书。
- 如果用了HTTPS,开启ZAP的Options > Dynamic SSL Certificates,确保使用正确域名证书。
- 用curl -v http://your-api-url --proxy http://localhost:8080测试是否能正常代理,排除应用层问题。

---

### 总结一下你可以试试的步骤:
1. 放弃Angular代理,改用浏览器或系统代理指向ZAP。
2. ZAP中开启WebSocket拦截。
3. 检查OPTIONS放过规则,确保允许目标域名。
4. 安装并信任ZAP证书,排除SSL导致的连接失败。

如果还是不行,可以尝试用浏览器扩展(如Proxy SwitchyOmega)或Burp Suite对比测试,确认是否是ZAP的兼容性问题。
点赞 3
2026-02-03 22:18