
本文介绍如何通过开发 zap 插件或使用代理脚本,在每次 zap 作为代理接收到 http 请求/响应时自动输出日志到控制台,适用于调试、审计和流量监控场景。
本文介绍如何通过开发 zap 插件或使用代理脚本,在每次 zap 作为代理接收到 http 请求/响应时自动输出日志到控制台,适用于调试、审计和流量监控场景。
ZAP(Zed Attack Proxy)作为一款开源 Web 应用安全扫描工具,其核心代理功能可拦截、修改和记录所有经过的 HTTP/HTTPS 流量。若需在每次收到请求或响应时执行自定义日志操作(例如打印 URL、状态码或请求头),有两种主流方式:开发插件扩展 或 使用内置代理脚本。二者均无需修改 ZAP 源码,且具备良好可维护性。
方式一:开发 ZAP 插件(推荐用于长期集成)
你需要实现 ProxyListener 接口,并在插件的 hook() 方法中注册该监听器。以下是关键步骤与示例代码:
-
继承 ProxyListener 并重写关键方法
public class LoggingProxyListener implements ProxyListener { @Override public boolean onHttpRequestSend(HttpMessage msg) { System.out.println("[REQUEST] " + msg.getRequestHeader().getURI()); return true; // 继续处理 } @Override public boolean onHttpResponseReceive(HttpMessage msg) { System.out.println("[RESPONSE] " + msg.getRequestHeader().getURI() + " → " + msg.getResponseHeader().getStatusCode()); return true; } // 可选:重写 onHttpRequestSend/onHttpResponseReceive 的变体以获取原始字节流 @Override public int getArrangeableListenerOrder() { return 0; // 控制监听器执行顺序(数值越小越早) } } -
在插件主类中注册监听器
@Override public void hook(ExtensionHook extensionHook) { super.hook(extensionHook); extensionHook.addProxyListener(new LoggingProxyListener()); }
✅ 注意事项:
- onHttpRequestSend 在请求发出前触发(即 ZAP 向目标服务器转发前);
- onHttpResponseReceive 在响应接收后触发(即 ZAP 收到服务器返回后);
- 日志将输出至 ZAP 的控制台(启动时的终端窗口或 GUI 中的 Output 标签页);
- 若 ZAP 启动时未启用 -debug 参数,部分异常可能被静默忽略,建议开发阶段始终启用调试模式。
方式二:使用代理脚本(快速验证首选)
ZAP 内置支持 Groovy 编写的代理脚本,无需编译打包,即时生效。路径:Tools → Options → Scripts → Add → Type: Proxy Script。
示例 Groovy 脚本(记录请求与响应):
// proxyLogger.groovy
def log = { msg -> println "[ZAP-PROXY] ${msg}" }
void proxyRequest(HttpMessage msg) {
log "→ ${msg.getRequestHeader().getMethod()} ${msg.getRequestHeader().getURI()}"
}
void proxyResponse(HttpMessage msg) {
log "← ${msg.getResponseHeader().getStatusCode()} ${msg.getRequestHeader().getURI()}"
}? 提示:社区维护的 proxy 脚本库 提供了多种预置模板(如 JSON 格式化、请求过滤、敏感信息脱敏等),可直接复用或二次开发。
总结
- 若需嵌入正式测试流程或分发给团队使用,插件方式更规范、可版本化、易集成 CI/CD;
- 若仅作临时调试或快速原型验证,代理脚本更轻量、零构建、即改即用;
- 两种方式均作用于 ZAP 的代理层,因此仅对经由 ZAP 代理的流量生效(需确保浏览器/应用配置了 ZAP 代理地址 127.0.0.1:8080);
- 避免在监听器中执行耗时操作(如网络请求、文件 I/O),否则会阻塞代理吞吐量,影响抓包实时性。
通过上述任一方案,你即可精准捕获每一次通信事件,并按需扩展日志内容(如记录时间戳、客户端 IP、请求体摘要等),为安全分析与自动化测试提供可靠数据支撑。

















