「加入扫描」功能 · 流程原型图

漏洞库 › 漏洞详情页 ›「加入扫描」——从选品入车到扫描执行的端到端原型与流程。

版本 v1.0 设计基线:现状 + 增强设计 入口:/pocs/<id> 后端:POST /api/scans
前端 / 现状已实现 后端 / 写库 增强设计(建议,未实现) 异常分支

1端到端总览

从漏洞库详情页到结果消费的完整链路。注意 A→B 与 B→C 之间为纯前端本地操作,网络与写库从 C 步骤开始。

A 漏洞库详情
浏览 PoC / CVE
→
B 加入扫描
写入本地草稿 + Toast
→
C 扫描页
补目标 / 项目 / 节点
→
D 起扫
POST /api/scans
→
E 执行回填
SSE + 命中入库
→
F 结果消费
报告 / 台账 / 导出
能力边界:A→B→C 期间无任何网络请求、无后端、无数据库变更;真正的任务创建、权限校验、资产/项目/命中入库,全部发生在 D 起扫 时。
阶段系统行为数据落点
B 加入草稿无则新建草稿 `POC 扫描` → 按 id 去重追加 PoC → 持久化 → Toast浏览器 localStorage
D 起扫权限校验 → 目标解析 → PoC 解析(poc_ids)→ 登记任务 → 资产沉淀 → 起子进程内存 TaskManager / scan_task / 资产表
E 执行回填SSE 推送进度与命中;终态落最终快照result 表 / scan_task 表

2正向流程(Happy Path)

F1 加入草稿 → F2 草稿管理 → F3 发起扫描 → F4 执行回填 → F5 结果消费。

F1 · 加入草稿 现状

校验详情已就绪
详情未加载则忽略点击(增强:按钮置灰)
确保活跃草稿
无 → 新建草稿「POC 扫描」并置为活跃;有 → 复用
去重追加 PoC
按 poc.id 去重写入 pocs[]
持久化
写入 localStorage["afrog_scan_tasks"](增强:失败降级提示)
反馈
Toast:已加入扫描:<名称>(增强:带「去起扫」行动点)

交互约束:不弹确认框、不跳页、不置灰、无 loading。

F2 · 草稿查看与管理 增强

草稿面板
PoC 列表(名称/级别/来源)、计数、移除/清空
空态引导
「还没选 PoC,去漏洞库挑几个」+ 跳转
移除 / 清空
清空需二次确认(破坏性)
恢复
刷新/重开浏览器后从 localStorage 原样恢复

界面原型 ①:漏洞库 › 漏洞详情页(入口)

http://127.0.0.1:16868/pocs/CVE-2025-XXXXX
← 返回漏洞库
critical 内置 已验证 CVE-2025-XXXXX
SmarterMail - Unrestricted File Upload
作者:afrog-team · 创建:2025-XX-XX · ID:CVE-2025-XXXXX
+ 加入扫描 编辑 另存为我的副本 删除
✓ 已加入扫描:SmarterMail - Unrestricted File Upload

点击「加入扫描」后:无弹窗、无跳转、按钮不变;仅出现上方 Toast,本地草稿新增该 PoC。

界面原型 ②:扫描页 › 已选 PoC 草稿面板 增强

http://127.0.0.1:16868/scans

已选 PoC(草稿) · 3 条

CRITSmarterMail - Unrestricted File Upload
内置 · 移除
HIGH某 OA 系统任意文件读取
精选 · 移除
HIGH某中间件未授权访问
我的 · 移除
清空去漏洞库添加
开始扫描选择项目执行节点

3F3 · 发起扫描(现状)

草稿在上述面板确认后,点击「开始扫描」触发后端。

组装请求
targets / poc_ids / enable_stream=true
→
POST /api/scans
jwtAuthMiddleware 校验
→
launchScan
目标解析 + PoC 解析 + 登记
→
201 Created
返回 taskId / scanInfo
→
订阅事件流
GET /scans/{id}/events (SSE)

请求体关键字段

targets目标清单(或改用 project_id)
project_id选中项目时以项目资产为目标
poc_ids来自草稿的 PoC 集(非空则以此为准)
enable_stream必须为 true
其他参数并发 / 速率 / 超时 / OOB / 端口扫描等

后端处理顺序

① 目标resolveScanTargets(空则 400)
② PoCresolveScanPocs(poc_ids → 临时目录,读不到静默跳过)
③ 登记任务入 TaskManager + 发 starting 事件
④ 沉淀资产沉淀 + 项目关联 + 通知登记
⑤ 执行名额充足即起,否则排队(默认上限 6)

4异常分支流程

按发生阶段分组;标注现状处理方式与增强目标。

编号异常处理逻辑归属
E1未登录 / 令牌过期调 /api/* 返回 401 → 前端拦截跳登录(提示「登录过期,请重新登录」)现状
E2无活跃草稿自动新建草稿并置为活跃(对用户透明)现状
E3重复加入同一 PoC按 id 去重,不重复追加(增强:提示「已在草稿中」)现状 增强
E4草稿含失效 PoC后端静默跳过 → 增强:起扫前校验并回显失效清单增强
E5无有效目标返回 400 缺少有效扫描目标,表单就地报错现状
E6项目无目标返回 400 该项目没有有效目标现状
E7enable_stream 非 true返回 400(正常前端不会触发)现状
E8存储写入失败(隐私模式/配额)当前静默吞掉 → 增强:降级提示「仅本次会话有效」增强
E9远程执行节点失联任务标「节点失联」,保留最后状态,恢复后自动对账现状
E10服务重启内存任务丢失;scan_task 历史快照(上限 200)仍可查现状
E11加入时详情未加载忽略点击(无副作用)→ 增强:按钮置灰增强

5草稿任务状态机

进入 starting 后再加入 PoC 只改本地记录,不影响已提交的扫描。

idle
草稿态 / 可继续加入
→
starting
已提交 / 可能排队
→
running
执行中
→
completed
完成
running ⇄ paused
暂停 / 继续
·
failed
异常 / 退出码非0
·
cancelled
用户终止

6权限校验矩阵

前端可见性仅作引导,以服务端校验为准。令牌角色仅 curated|free 两档。

操作前端可见性后端校验
浏览漏洞库 / 详情全部登录用户jwtAuthMiddleware
加入扫描(本地)全部登录用户无网络请求,不涉及权限
开始扫描全部登录用户jwtAuthMiddleware
复测对比 / 计划扫描 / 台账 / 通知 / 集群 / 导出会员可见(含上锁预览)requireCurated