ZAP API 调用需正确启动进程并配置端口、API key及scope:启动时加-config参数启用远程API,Python访问用127.0.0.1:8080并传params={'apikey'};需显式管理session、context与认证;spider/ascan前须排除无关域名并严格正则限定scope;alerts()需分页获取,message(id)取原始流量,htmlreport更完整。
ZAP API 调用必须启用并验证端口与 API key
ZAP 默认不开放远程 API,直接调用
或发 HTTP 请求会返回 403 或连接拒绝。核心不是“怎么写 Python 脚本”,而是 ZAP 进程本身是否以正确参数启动。
启动 ZAP 时务必加
,否则 Python 侧再怎么配 URL 都连不上
Python 中访问地址必须是
(默认端口),不能用
—— 某些容器或 hosts 配置下 DNS 解析会导致 API key 校验失败
API key 必须和启动参数里的一致,且需通过
的
传入,例如:
,放在 header 或 body 都无效
Python zap-api-
python
库的 session 管理容易断连
官方
库封装了基础调用,但它不自动维护 ZAP 的 active scan session 或 context 生命周期。常见现象是:前几步正常,跑着跑着
返回 -1 或
。
每次发起 active scan 前,先用
显式新建会话,避免旧 session 数据干扰
如果要复用 context(比如带登录脚本的认证测试),必须用
+
配好,且确保 context 已通过
加入
不要依赖库的默认超时;ZAP 扫描可能卡住,建议对
加
和重试逻辑,否则 Python 进程会挂起
爬虫范围控制不当导致扫描超出预期域名
ZAP 的 spider 和 ascan 默认基于“初始 URL”做同源策略推导,但 Python 脚本里若只传一个
,它可能顺藤摸瓜扫到
甚至
—— 尤其当页面里有跨域 JS 请求或跳转时。
务必在启动 spider 前,用
排除内网或无关域名
设置严格 scope:先
,再
,正则必须以
和
边界限定
避免用
的
参数传带 query 的地址(如
),ZAP 可能将其当作不同路径反复爬取;应先 login 再 set context scope
报告导出为 JSON 时字段缺失或结构嵌套过深
返回的 JSON 看似完整,但实际漏掉 request/response 原始内容、HTTP headers、甚至部分 risk 字段——这是 ZAP 的设计限制,不是 Python 脚本没写对。
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
立即学习
“
Python免费学习笔记(深入)
”;
要用
手动分页拉取,ZAP 默认只返回前 50 条
真正带原始流量数据的接口是
,但 id 需从
结果里的
字段取,不是
导出 HTML 报告更可靠:
返回的是完整字符串,可直接写入文件;JSON 报告建议仅用于轻量级统计,别指望它覆盖所有审计细节
ZAP 和 Python 的集成关键不在语法,而在于对 ZAP 进程状态、scope 边界、API 认证链路的理解。漏掉任一环,脚本都可能“看似运行成功”,实则没扫到目标、没拿到数据、或扫了不该扫的地方。
zap.urlopen()-config api.addrs.addr.name=.* -config api.addrs.addr.regex=true -config api.key=yourkey123http://127.0.0.1:8080localhostrequestsparamsparams={'apikey': 'yourkey123'}zap-api-pythonscan_idAssertionError: No scan ID returnedzap.core.new_session()zap.authentication.set_authentication_method()zap.authentication.set_logged_in_out_urls()zap.context.include_in_context()zap.ascan.status(scan_id)timeout=60https://dev.example.com/loginhttps://api.example.comhttps://staging.example.netzap.spider.exclude_from_scan(r'https?://.*\.internal.*')zap.context.new_context('test')zap.context.include_in_context('test', r'^https://prod\.example\.com/.*$')^$zap.spider.scan()url?token=xxxzap.core.alerts()zap.core.alerts(baseurl='', riskid='', start=0, count=1000)zap.core.message(id)alerts()messageIdalertIdzap.core.htmlreport()