Garden: 从扫描到统一资产清单

提交一次已授权入口,自动完成预检、发现、采集、分析和证据报告;Web、API、CLI 共用同一核心服务。

View on GitHub
One URL

一次提交

普通用户只需输入 HTTP(S) URL;不需要创建 target、复制任务 ID 或手动运行中间 CLI。

End-to-end

完整工作流闭环

validate → discover → collect → normalize → analyze → report 六阶段持久化执行,进度、失败、覆盖缺口和报告位置均可查询。

Safe by default

安全护栏默认开启

默认允许已授权公网与本机目标、不做破坏性检查、secret 不直接存储、evidence 默认脱敏、所有关键操作记审计日志。

v0.5.0 · 多来源资产发现

从一个入口,汇集更多资产线索

HTML、Sitemap、匿名浏览器、Hash 路由、JS 静态线索和 URL/OpenAPI 导入,共用同一清单、来源筛选和导出。

明确发现来源,区分响应和声明

默认 HTTP 采集;在 Web「发现选项」中开启地图、JS 线索或匿名浏览器。动态请求只允许 GET/HEAD;表单、JS 静态声明和 OpenAPI 操作保留为候选,不自动提交或调用。

路由视图与 HTTP 响应分别记录。每条记录可查看脱敏来源,按来源筛选;详情页、CLI 和报告说明发现、新候选、重复、请求尝试与响应观察。统计不是站点发现率,执行结束也不表示覆盖完整。

候选、地图递归、页面、资源和浏览器请求均有上限。输入原文不回显;预览临时保留 15 分钟,历史任务导入内容需重新提供。新增发现选项当前用于匿名扫描,已有认证采集流程保留。

garden scan https://authorized.example --sitemap --js
garden scan https://authorized.example --collection-mode browser --max-browser-requests 150
garden assets list --source scan --run-id N --source-kind sitemap

本地验收:入口 + 页面链接 + URL 种子得到 3 条已有响应;POST 表单保留为 1 条未请求候选。按 URL 导入来源筛选和导出均为 1 条,查询值在预览、清单及报告中脱敏。

升级执行 garden db upgrade 至迁移 0007;JSON/CSV 使用资产 schema 1.3,旧记录未知来源不补造。

v0.4.2 · 有效性线索

分清已观察响应、未请求候选与待确认资产

清单标注疑似登录回退、软 404、统一响应和重定向别名,可筛选、展开原因,并随 JSON/CSV 导出。

保留证据,也保留不确定性

候选视图单独展示 quick scan 保存的未请求队列,不混入资产记录总数。历史任务或未提供队列时显示未知;切换视图不改变任务已有响应计数。

规则只分析已有采集结果,不增加探测。同站点、同身份且完整的响应才参与内容对比。HTTP 200 或未命中线索不代表已确认业务资产,所有业务有效性结论保持待确认。

Web、CLI 和导出采用相同规则 passive-v1;升级数据库至迁移 0006 后使用新增元数据。

v0.4.1 · Trusted grouping

资产归并后,参数变体和身份观察仍可追溯

在资产清单切换“归并资产”,查看同一路由下保留的原始观察、请求变体及证据入口。

归并有依据,差异不丢失

garden assets list --source scan --run-id N --view grouped 使用版本化规则,隔离站点、方法、类型和精确路径;JSON/CSV 导出保留全部匹配观察。

新捕获请求区分参数值、请求体和请求头差异,并保留响应状态。历史数据无法还原精确变体数时显示未知。路由归并不代表业务等价,也不是跨任务资产库。

v0.4.0 · Unified assets

匿名与登录后的采集结果,使用同一套清单

从扫描结果或 inventory 任务进入资产表,按类型、身份、观察状态筛选,追溯来源并导出。

可筛选、可分页、可交付

garden assets list --source scan --run-id N 查看已有记录;garden assets export --source scan --run-id N --format json --output assets.json 导出全部匹配记录,也支持 CSV 与 inventory 来源。

计数来自实际资产记录,不跨身份或任务归并。“已有响应”不代表资源有效或目标安全;缺失信息保持未知。来源详情保留记录 ID 和已有证据关联,常规输出对 URL 查询值脱敏。

清单查询与导出不会重新访问目标;不改变现有登录和采集流程。N 为已存在的任务 ID。

Local diagnostics

启动遇到问题,先运行 garden doctor

检查当前安装、配置来源、浏览器文件、数据库版本、本地端口与存储权限,给出正常、需要处理或无法确认。

看清原因,再决定如何处理

garden doctor 输出脱敏诊断与建议;garden doctor --json 方便收集结构化结果。可用 --ui-port 指定本机端口。

只读检查不会自动安装、迁移、创建目录、启动或停止服务,也不会访问扫描目标。端口有监听不等于 Garden 健康;浏览器文件存在不等于已验证实际运行能力。

Coverage gaps

解释为什么没有覆盖

结果页、CLI 和新报告共用解释。执行进度 100% 不代表覆盖完整。

匿名:页面数上限(2);未请求 URL:3

这是示例说明。新匿名扫描按页面数、资源数和发现深度分别记录已发现但未请求的同源 URL,附最多 3 条脱敏样例。已尝试但失败的请求另行说明。

旧记录、超时和身份上下文失败无法提供可靠数量时显示“数量未知”。认证覆盖仍按匿名、普通用户、管理员解释缺口;未观察到的内容保留 unknown。

沿用匿名任务配置 → 调整预算 → 重新预览 → 确认新任务。没有缺口条目不代表整个站点已覆盖。

Pipeline

工作流

6 个自动阶段,每个阶段产出结构化数据,不是纯文本日志。

validate → discover → collect → normalize → analyze → report
对比

Garden 与主流安全工具的定位差异

Garden vs Burp / ZAP

Burp/ZAP 强在代理抓包、手工测试、主动扫描。Garden 补的是登录编排、结构化 Inventory、Finding 生命周期、证据脱敏、复测与报告导出。

Garden vs Nuclei

Nuclei 擅长匿名协议级模板扫描。Garden 专注登录后的业务路径验证,产出面向团队协作的结构化结果。

Garden vs 流量录制工具

录制工具解决"流量怎么拿"。Garden 解决"拿到之后怎么办"——把流量变成 inventory、findings、证据、复测对象。

Garden vs API 权限测试框架

API 越权测试只看接口权限。Garden 同时覆盖浏览器态、页面态、接口态和登录后的完整业务路径。

Constraints

设计约束

Quick start

5 分钟开始

$ git clone https://github.com/Moxxkidd/Garden.git
$ cd garden
$ pip install -e '.[dev]'
$ cp .env.example .env

$ make demo
# open http://127.0.0.1:8000 and submit one URL

# or use the same core service from CLI:
$ gardenctl scan --url http://127.0.0.1:8888/