不能直接横向比较,除非先把“页面年龄”从检测结果里剥离出来。恶意代码检测的命中率、告警数量、被注入概率,都会受页面存在时长、被爬取次数、外链沉淀量影响。上线三个月的页面和上线三年的页面放在同一张表里比“谁更脏”,结论往往只是“谁被访问得更多”,而不是“谁的安全策略更差”。
如果新旧页面来自同一套模板、同一批外链、同一台服务器,那么它们面对的攻击面基本一致。此时可以比较,但要比的是“单位时间内的检测命中率”,而不是累计命中数。做法是:把每个页面的告警数除以该页面上线以来的天数,得到日均命中。如果新页面日均命中明显高于老页面,才值得怀疑模板或组件在近期被改坏。
如果新旧页面模板不同、外链来源不同、甚至部署在不同服务器上,那么直接比较没有意义。老页面累计命中多,通常只是因为它在网上待得久、被扫描器反复光顾。这种情况下,正确动作是先按“模板批次”和“外链来源”分组,只在组内比较。分组后如果组内仍然出现异常,再进入下一步排查。
要判断差异是“年龄造成”还是“真实风险”,可以看命中是否集中在同一类注入点。假设有一个页面A上线两年、页面B上线两个月,A累计告警40条、B累计告警12条。单看总数A更差。但如果把告警按类型拆开:A的40条里35条是老旧留言板被机器人灌入的垃圾链接,B的12条里有9条是同一段被篡改的JS脚本,那么B的问题更值得优先处理,因为脚本注入会直接影响访问者,而垃圾链接更多是内容质量问题。
这个判断依据是:恶意代码检测的告警类型比告警总数更能说明风险性质。脚本注入、iframe嵌套、重定向跳转属于会影响用户的类型;垃圾外链、爬虫留言属于内容治理类型。两类混在一起统计,年龄差异就会被放大成风险差异。
具体做法是:为每个页面设定一个固定的观察窗口,比如最近30天,只统计窗口内的检测结果。这样新旧页面就被拉到同一时间尺度上。动作结果是:老页面不再因为“活得久”而占便宜,新页面也不会因为“刚上线、还没被扫到”而显得干净。
窗口设定后,下一步要看的是窗口内是否出现“新增类型”。如果某个页面在窗口内第一次出现脚本注入类告警,即使总数不高,也应单独标记。反之,如果窗口内只有重复的垃圾外链告警,可以降级处理。这个动作把比较从“谁总数多”转成“谁在近期出现了新风险类型”。
有一种情况不能套用上面的窗口法:页面刚上线几天,检测就出现大量脚本注入或重定向告警。这时年龄不是解释项,更可能是模板本身携带了恶意代码,或者部署环境被污染。此时应暂停横向比较,直接检查该页面对应的模板文件和部署包,而不是继续和旧页面比数字。
还有一种例外是页面虽然老,但长期没有被搜索引擎或外部平台抓取,站内统计也几乎没有访问。这种情况下它的累计命中低,不能证明它安全,只能说明它没有被暴露。要判断真实状态,需要主动发起一次检测,而不是依赖历史累计数据。
业务上线时间不同的页面,只有在模板、外链、服务器条件一致时,才可以用“单位时间命中率”做初步比较;条件不一致时,先分组再比较。无论哪种情况,都要把告警按类型拆开,并优先处理窗口内新出现的脚本注入类问题。这样得到的结论才指向具体页面,而不是指向页面活了多久。