先判断“页数”和“对象数量”是不是同一个口径:多数扫描报告按“检测项”或“文件路径”分页,而资产清单按“主机”“目录”或“样本”计数,两者本来就不该相等。真正需要去重的是同一对象被多个路径、多个告警名或多次扫描重复计入的部分,而不是把页数强行压成对象数。
把报告导出为可逐条阅读的清单后,逐项标记它属于哪一类重复。常见来源有三类:同一文件被不同路径写法指到(绝对路径、相对路径、短路径);同一威胁被不同引擎给出不同名称;同一对象在多次扫描中重复出现。三类重复的合并规则不同,混在一起处理会把真实的多对象结果误删。
如果三类同时存在,先按“对象标识”归并,再按“告警名”归并,最后按“时间”取最新,顺序反过来会丢掉可追溯的原始记录。
面对不一致,处理方式取决于这份报告接下来要给谁看、用来做什么决定。
当报告要交给执行人员去清理,或需要说明“为什么当初判为风险”,应保留原始条目,只在旁边加一列归并后的对象标识。这样对象数可以核对,页数偏多也能解释。前提是团队能接受报告比资产清单长,并且有人负责读归并列。
当读者只关心“有多少个对象需要处理”,可以把报告改写成按对象聚合的清单:一个对象一行,列出它命中的全部告警名和路径。改写会丢失单条告警的上下文,所以原始报告要另存一份。前提是聚合规则事先写清楚,否则不同角色会各自理解“一个对象”指什么。
如果页数与对象数的差异只来自命名别名,且清理动作对每个别名都一样,可以退出逐条比对,直接按对象执行。前提是已经确认没有路径或时间维度的重复被掩盖。退出不是忽略差异,而是承认这个差异不影响下一步动作。
多个角色对“到底有几个对象”理解不同时,争论口径没有意义,应该把分歧写成一张可勾选的核对表。假设一份报告显示 120 页、资产清单显示 80 个对象,可以这样拆:
若 A 等于资产清单数量,说明页数偏多主要是命名和时间重复,去重重点是告警名归并;若 A 大于清单数量,说明报告里存在清单未登记的对象,这时不应去重,而应先补全资产范围。这个判断直接决定下一步是整理报告还是先修资产台账。
假设某次扫描导出 300 条记录、分成 60 页,资产清单登记 50 台主机。按对象标识归并后得到 48 个唯一对象,其中 2 个对象在清单中找不到对应登记。此时正确动作不是把 300 条压成 50 条,而是:先确认那 2 个未登记对象是否真实存在,再决定是补登记还是从报告中排除;剩下的 48 个对象按告警名归并后得到 40 条待处理项。这样页数、对象数、待处理数三个数字各有出处,任何角色都能复核,而不是各自报一个数。
去重的终点不是让数字好看,而是让“有多少对象、每个对象要做什么”这两件事可以被独立核对;只要这两个问题有明确答案,页数与对象数的差异就不再是分歧,而是一条可以解释的口径说明。