先给有条件的结论:如果扫描器在中断时留下了逐条目标的状态记录,并且你能拿到中断前的任务日志,那么可以按“已完成、进行中、未开始”三类还原覆盖范围;如果只有一份汇总结果、没有逐条状态,那么更稳妥的做法是把这次扫描视为不完整样本,只使用其中能重复验证的发现,然后重新划定一个小范围复扫。下面这个前提很关键:中断原因如果是目标侧限流、网络抖动或凭据过期,已扫到的部分通常仍可用;但如果中断发生在扫描器更新规则库或切换检测模块时,前半段和后半段的判定口径可能不一致,覆盖范围就不能简单相加。
判断覆盖范围的第一步不是看扫出了多少条问题,而是看任务记录里有没有“每个目标当前处于哪个阶段”。常见的扫描流程会依次经过发现、请求、分析、归档几个阶段,中断时不同目标停在不同阶段。如果日志按目标记录了阶段,你可以直接统计:哪些目标已经进入归档、哪些只完成请求、哪些还没被请求到。
如果只有一份最终汇总,没有逐条阶段标记,那么这份结果只能说明“扫描器在中断前报告过这些发现”,不能说明“这些目标已被完整检测”。这两种表述的差别,决定了你下一步是补扫还是重扫。
一个可执行动作:把任务日志按目标 ID 或 URL 排序,筛出最后一次状态更新时间早于中断时间的记录。如果这些记录的阶段字段是“完成”,它们可以计入覆盖;如果停在“请求中”或“分析中”,应归入未覆盖或部分覆盖。这个动作的结果会直接决定你下一步是只补未完成目标,还是整体重跑。
“被请求过”不等于“被检测过”。要判断覆盖范围,至少要看三类证据是否同时存在:
只有请求记录时,覆盖范围应视为“已触达但未完成检测”;只有检测项记录、没有归档时,应视为“检测已执行但结果未落盘”。这三类证据缺哪一类,都会让覆盖范围从“完整”降级为“部分”。
假设一个例子:某次扫描计划覆盖 200 个页面,中断时日志显示 120 个页面有请求记录,其中 80 个有检测项记录,只有 50 个有归档记录。此时不能对外说“已覆盖 120 个页面”,更合理的说法是“完整覆盖 50 个,部分覆盖 30 个,已触达未检测 40 个,未触达 80 个”。这个拆分只是说明比较方法,不代表真实项目数据。
同样是中断,原因不同,已覆盖范围的可信度也不同。可以按下面几种情况区分:
一个反例会推翻前面的结论:如果中断发生在规则库热更新之后,而日志没有记录每条目标使用的规则版本,那么即使每个目标都有“完成”状态,你也无法判断它们是否在同一口径下完成。此时“按状态统计覆盖范围”的做法失效,应该改为按规则版本分组,或者直接对关键目标重新扫描一次。
判断覆盖范围的目的不是出一份统计,而是决定接下来做什么。可以按下面的顺序处理:
这个顺序的实际影响是:你会得到一份“可用的已覆盖清单”和一份“必须补扫清单”,而不是一份笼统的完成百分比。下一步的复扫范围、时间安排和是否需要更换扫描方式,都从这两份清单里来。
补扫适合中断原因明确、规则口径未变、且未完成目标可以单独指定的情况。重扫适合以下任一情况:没有逐条状态记录;中断期间规则库或检测模块发生过变化;已覆盖部分和未覆盖部分无法用同一口径比较。重扫不一定要全站重来,可以按目标分组,先扫必须完整覆盖的那一组,再决定其余目标是否纳入。
如果选择补扫,动作是导出未完成目标列表,确认这些目标当前仍可访问、凭据仍有效,再启动一次只针对该列表的任务。补扫完成后,把新结果与中断前的归档结果按目标合并,合并时检查同一目标是否出现口径不一致的检测项。如果出现,以最近一次完整执行为准,而不是简单取并集。这个动作的结果会决定你是否还需要第三次扫描:如果合并后仍有目标缺少归档记录,就继续缩小范围,而不是扩大扫描面。