扫描被中断时,最危险的判断是“看到一部分结果,就默认全站已经扫过”。要判断已覆盖范围,不能只看还剩多少条,而要把中断前的日志、任务队列和样本抽查放在一起对照,确认哪些URL真的处理完、哪些只是被列入队列、哪些从未进入。下面用一个假设情境说明这个判断过程。
假设你用某个站点扫描工具对一万个URL做全站检查,跑到大约四成时任务中断。此时界面上可能仍显示一万条总数,也可能只显示已完成的几千条,但这两个数字都不等于“已覆盖范围”。真正需要区分的是:
只有第一类能算作本次扫描的实际覆盖。第二类只是“计划覆盖”,第三类则是盲区。把三类混在一起,就容易把排队数当成已覆盖数。
中断后的第一动作不是重新跑,而是先固定证据:导出中断前的任务日志、已完成列表和待处理队列。日志里通常能看到最后成功处理的URL、时间戳和处理状态;队列则能看出中断瞬间还剩哪些任务。把两者按URL去重后,可以得到一个粗略的覆盖边界。
但日志本身也可能不完整,例如写入延迟、批量提交或并发任务导致最后一批结果没落盘。因此还要做一次抽查:从“已完成”列表里随机抽少量URL,重新单独检查,确认它们的结果与日志一致;再从“未处理”里抽少量URL,确认它们确实没有结果记录。抽查不需要覆盖全站,它的作用是验证日志边界是否可信。
实际动作:先导出日志和队列,做去重和状态标记,再抽查两端样本。这个动作的结果会直接决定下一步——如果日志边界可信,就只需补跑未处理部分;如果日志与抽查不一致,就不能信任任何范围数字,只能重新规划扫描。
抽查几十个URL都正常,并不自动说明剩余几千个也正常。样本成立但规模化后出现例外,通常有几种可区分的原因:
因此,样本只能用来验证“日志记录是否可信”,不能用来推断“全站覆盖是否完整”。当站点规模大、链接层级深或存在大量动态入口时,抽查的结论边界要收得更紧。
一个可复核的结论应该写成条件句,而不是一个孤立的百分比。例如:
“在假设本次扫描共发现一万个URL、日志记录完成四千个、队列剩余三千个、抽查两端样本一致的前提下,可判断已处理约四千个,未处理约三千个,另有约三千个状态不明,需要重新发现链接后再确认。”
这个写法把数字和前提绑在一起,别人可以按同样方法复核。相反,“覆盖了四成”这种说法省略了分母来源和状态划分,无法复核。
如果中断原因是工具崩溃或网络断开,还要确认重新启动后是否会覆盖旧结果、是否支持断点续跑。不同工具的行为不同,具体功能需要以你所用工具的当前说明为准,不能默认它一定支持续跑。
判断完覆盖范围后,下一步是选择补跑未处理部分,还是全量重跑。两种选择成立的条件不同:
补跑的风险是两次结果的时间点不同,可能把不同状态混在一份报告里;全量重跑的风险是耗时更长,但结果一致性更好。选择哪一种,取决于你要拿这份结果做什么决定。如果只是排查少量异常,补跑通常够用;如果要对外输出全站结论,全量重跑更稳妥。
最后要提醒的是,抓取量归零、队列清空或某个统计突然消失,都不能单独证明扫描已经完整覆盖。它们也可能由限速、权限变化、任务重置或显示延迟造成。判断覆盖范围,始终要回到日志、队列和抽查三者是否相互印证。