You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Azure CI管道或命令提示符下执行ZAP全扫描及解决命令异常

使用ZAP执行全量扫描(含Spider、AjaxSpider、WebSocket、主动扫描)并自动退出生成报告

问题分析

你之前使用的-quickurl参数属于ZAP的快速扫描模式,仅包含基础爬虫和主动扫描流程,不支持AjaxSpider、WebSocket扫描,因此无法满足全量扫描需求。同时:

  • -daemon模式未指定退出逻辑时会持续运行,导致命令行阻塞;
  • -cmd参数虽能让ZAP执行后退出,但配合-quickurl仍只能触发快速扫描。

解决方案

方案一:自定义自动化脚本(推荐,适配全量扫描需求)

通过编写ZAP脚本定义完整扫描流程,配合-cmd参数实现无GUI扫描、自动退出、生成报告的全流程。

步骤1:编写扫描脚本

创建full-scan.js文件,内容如下:

// 配置目标URL和报告路径
const targetUrl = "https://juice-shop.herokuapp.com/";
const reportPath = "C:/TestResults_UIAutomation/FullZAPReport.html";

// 获取ZAP核心组件
const model = org.parosproxy.paros.model.Model.getSingleton();
const session = model.getSession();
const control = org.parosproxy.paros.control.Control.getSingleton();

// 创建扫描上下文
const context = session.getContexts().get(0);
context.setName("FullScanContext");
context.addIncludeInScope(targetUrl + ".*");

// 1. 执行传统Spider扫描
print("启动传统Spider...");
const spiderExt = control.getExtensionLoader().getExtension(org.zaproxy.zap.extension.spider.ExtensionSpider.class);
spiderExt.setContext(context);
spiderExt.startScan(targetUrl);
while (spiderExt.isScanning()) {
    java.lang.Thread.sleep(1000);
}
print("传统Spider扫描完成");

// 2. 执行AjaxSpider扫描(适配SPA应用)
print("启动AjaxSpider...");
const ajaxExt = control.getExtensionLoader().getExtension(org.zaproxy.zap.extension.ajax.ExtensionAjax.class);
const ajaxSpider = ajaxExt.getAjaxSpider();
ajaxSpider.setContext(context);
ajaxSpider.scan(targetUrl, true, false);
// 设置5分钟超时,防止无限等待
const timeout = 300000;
const startTime = new Date().getTime();
while (ajaxSpider.isRunning() && (new Date().getTime() - startTime) < timeout) {
    java.lang.Thread.sleep(1000);
}
ajaxSpider.stop();
print("AjaxSpider扫描完成");

// 3. 执行WebSocket扫描
print("启动WebSocket扫描...");
const wsExt = control.getExtensionLoader().getExtension(org.zaproxy.zap.extension.websocket.ExtensionWebSocket.class);
const wsEndpoints = wsExt.getWebSocketEndpointManager().getEndpoints();
for each (const endpoint of wsEndpoints) {
    wsExt.scan(endpoint);
    while (wsExt.isScanning(endpoint)) {
        java.lang.Thread.sleep(1000);
    }
}
print("WebSocket扫描完成");

// 4. 执行主动扫描
print("启动主动扫描...");
const aScanExt = control.getExtensionLoader().getExtension(org.zaproxy.zap.extension.ascan.ExtensionActiveScan.class);
const scanId = aScanExt.startScan(targetUrl, null, context, null);
while (aScanExt.isScanning(scanId)) {
    java.lang.Thread.sleep(1000);
}
print("主动扫描完成");

// 5. 生成HTML报告
print("生成扫描报告...");
const reportExt = control.getExtensionLoader().getExtension(org.zaproxy.zap.extension.report.ExtensionReport.class);
reportExt.generateHtmlReport(reportPath, context);
print(`报告已生成:${reportPath}`);

// 退出ZAP
control.exit();

步骤2:执行扫描命令

将脚本放在ZAP安装目录或指定路径,执行以下命令:

zap.bat -cmd -autorun "C:/path/to/full-scan.js"
  • -cmd:让ZAP以命令行模式运行,执行完成后自动退出
  • -autorun:指定要执行的自动化脚本

方案二:命令行参数链(简化版,基础全量扫描)

若不需要精细控制扫描流程,可通过ZAP命令行参数依次触发各扫描模块,配合-cmd实现自动退出:

zap.bat -cmd ^
    -spider https://juice-shop.herokuapp.com/ -spiderprogress ^
    -ajaxSpider https://juice-shop.herokuapp.com/ -ajaxSpiderTimeout 300 ^
    -ascan https://juice-shop.herokuapp.com/ -ascanprogress ^
    -report C:/TestResults_UIAutomation/FullZAPReport.html -reportformat html

注:Windows命令行换行用^,Linux/macOS用\;此方案未包含WebSocket扫描,若需该模块建议使用方案一。

注意事项

  • 若目标无WebSocket服务,可删除脚本中WebSocket扫描相关代码
  • AjaxSpider建议设置超时,避免因SPA页面无限加载导致扫描无法结束
  • CI环境中需确保ZAP有足够权限写入报告路径,且目标URL可访问

内容的提问来源于stack exchange,提问作者KR Akhil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 05:43:20