
本文介绍如何通过开发 zap 插件或使用代理脚本,在每次 zap 接收 http 请求/响应时自动输出日志到控制台,涵盖 proxylistener 实现方式、注册流程及更轻量的替代方案。
本文介绍如何通过开发 zap 插件或使用代理脚本,在每次 zap 接收 http 请求/响应时自动输出日志到控制台,涵盖 proxylistener 实现方式、注册流程及更轻量的替代方案。
要在 OWASP ZAP 中实现“每次接收到通信即记录日志”的功能,最直接且可扩展的方式是开发一个 ZAP 插件(Add-on),并注册自定义的 ProxyListener。该监听器会在代理层捕获所有经过 ZAP 的 HTTP 流量(包括请求与响应),适合用于调试、审计或流量分析场景。
✅ 正确实现步骤(插件方式)
-
实现 ProxyListener 接口
创建一个类(例如 LoggingProxyListener),继承并实现 org.parosproxy.paros.core.proxy.ProxyListener 接口。关键方法如下:
import org.parosproxy.paros.core.proxy.ProxyListener;
import org.parosproxy.paros.network.HttpMessage;
public class LoggingProxyListener implements ProxyListener {
@Override
public boolean onHttpRequestSend(HttpMessage msg) {
System.out.println("[ZAP Proxy] Request sent to: " + msg.getRequestHeader().getURI());
return true; // 继续处理
}
@Override
public boolean onHttpResponseReceive(HttpMessage msg) {
System.out.println("[ZAP Proxy] Response received from: " +
msg.getRequestHeader().getURI() +
" | Status: " + msg.getResponseHeader().getStatusCode());
return true;
}
// 其他方法可留空或返回默认值
@Override public String getListenerName() { return "LoggingProxyListener"; }
@Override public void onProxyChange(Proxy proxy) {}
@Override public void onProxyServerConnectionUp() {}
@Override public void onProxyServerConnectionDown() {}
}-
在插件主类中注册监听器
在你的 Extension 子类(如 ExtensionLoggingAddon)的 hook() 方法中,将监听器添加到 ExtensionHook:
@Override
public void hook(ExtensionHook extensionHook) {
super.hook(extensionHook);
extensionHook.addProxyListener(new LoggingProxyListener());
}-
构建并安装插件
使用 Maven 构建 .zap 插件包后,通过 ZAP 的 Manage Add-ons → Install Add-on from file 安装即可。启动 ZAP 后,所有代理流量将在控制台实时打印日志。
⚠️ 注意事项:
- onHttpRequestSend 对应 ZAP 发出的请求(即客户端→ZAP),而 onHttpResponseReceive 对应 ZAP 收到的响应(即目标服务→ZAP);若需捕获“ZAP 作为客户端接收的原始请求”,实际应关注 onHttpRequestSend(因 ZAP 此时是中间代理)。
- 日志输出依赖 ZAP 启动终端(如命令行运行 ./zap.sh),GUI 模式下需确保标准输出未被重定向。
- 若仅需临时调试,强烈建议优先尝试代理脚本(Proxy Script) —— 无需编译、零配置、即时生效。
? 更轻量的替代方案:使用 ZAP 内置代理脚本
ZAP 支持以 JavaScript(Nashorn 或 GraalJS)编写的代理脚本,路径为:
ZAP GUI → Tools → Options → Scripts → Add → Type: Proxy
示例脚本(JavaScript):
function proxyRequest(msg) {
print("[PROXY REQUEST] " + msg.getRequestHeader().getURI());
}
function proxyResponse(msg) {
print("[PROXY RESPONSE] " + msg.getRequestHeader().getURI() +
" → " + msg.getResponseHeader().getStatusCode());
}启用脚本后,所有代理流量将自动触发对应函数,日志同样输出至 ZAP 控制台(可通过 Help → Show Console 查看)。
✅ 总结
- 插件方式适合长期集成、复杂逻辑或需 UI 扩展的场景;
- 代理脚本方式适合快速验证、临时监控或团队共享调试流程;
- 无论哪种方式,均作用于 ZAP 代理链路,对被动扫描、主动扫描等非代理流量不生效;如需全局日志(如 Spider、Ajax Spider),需结合 HttpSender 或 ScannerListener 等其他扩展点。
通过以上任一方式,你都能精准掌控 ZAP 的每一次通信行为,并为安全测试提供清晰可观测的日志基础。

















