如果同一批访客在刷新后拿到不同页面版本,而挂马检测工具只对其中一个版本报警,那么首要怀疑对象不是工具漏报,而是样本污染:不同节点、不同缓存层或不同入口把访客分到了不同内容,检测样本并不能代表所有访客实际看到的页面。判断是否成立,需要先固定“同一时间、同一路径、同一身份”这三个变量,再看差异是否随节点或缓存状态变化。
访客被分配到不同版本,常见原因有三类:一是 CDN 或反向代理缓存了旧版本,部分节点未刷新;二是灰度发布、A/B 测试或按地域分流,本来就存在多个合法版本;三是攻击者只对特定 UA、Referer 或 IP 段返回挂马内容,普通检测请求拿到的是干净版本。
区分方法很直接:对同一 URL 连续发起多次请求,记录响应状态、Content-Length、ETag、Last-Modified 和响应体哈希。如果哈希只随节点变化,问题在缓存层;如果只随 UA 或来源变化,问题在服务端分流逻辑;如果同一节点同一 UA 也出现两个哈希,才需要怀疑内容本身被动态注入。
这三个信号指向的处理动作不同:第一种要补全请求头再抓取,第二种要缩短抓取间隔并保留时间戳,第三种要按节点维度建立样本清单。把三种情况混在一起,后续清理就会反复。
假设某站点有 A、B 两个边缘节点,工具默认只从 A 节点抓取。A 节点返回正常首页,B 节点因缓存未刷新仍返回旧版首页,而旧版首页里残留了一段已被替换的第三方脚本。工具报告“未发现异常”,但部分访客实际访问 B 节点时仍会加载旧脚本。
这个例子里,工具没有报错,错在样本只覆盖了一个节点。验证方式是分别向 A、B 节点发起请求并对比响应体哈希,而不是增加扫描频率。确认差异后,下一步动作是清理 B 节点缓存并重新取样,而不是直接修改源站文件。
反例是:所有节点、所有 UA、所有时间点的响应体哈希完全一致,但访客仍报告看到不同版本。这时样本污染解释不了现象,更可能的原因在访客侧,例如浏览器扩展、本地代理、DNS 劫持或访客访问的根本不是同一域名。此时继续在服务端找版本差异会浪费时间,应转为核对访客的完整请求链路。
另一个会使判断失效的条件是:站点本身正在做合法的多版本发布,且分流规则未记录。这种情况下差异是设计结果,不是污染,检测工具需要的是按版本分别建立基线,而不是消除差异。
在排除访客侧原因后,按以下顺序执行:
只有当复测后各节点样本一致,才能把之前的报警或漏报归因到具体版本。如果复测仍不一致,说明还有未覆盖的分流维度,需要继续缩小取样范围,而不是直接下结论。