那个被我们叫做「坏了」的文件
本项目的图片目录里放着一个 stats2.gif。它有 366 字节,日期是 2018 年 3 月,在源代码里出现的次数正好是零。2026 年 8 月 23 日,它被以 200 状态送出 2735 次,来自 145 个不同的站点——把整轮访问日志算完,是 858 个。
一个没有任何代码引用的文件,每天却被几百个别人的网页取走几千次。显而易见的解读是:某段老旧的嵌入代码没人换过,在本该是计数器的位置上静静地送出一张静态图。静态文件完全绕开 PHP,凡是直接落到 Apache 手里的东西,都不可能计到任何数。
于是我们写了个工具。它从日志里读出每一个引用页,用本站诊断嵌入代码时已经在用的那个抓取器把每一页取回来——带着它的 SSRF 防护,因为这些网址来自日志而不是我们自己——再看那个页面上到底有没有东西真的在计数。
全部 858 个页面
| 已经在计数(旁边有能用的嵌入代码) | 501 |
| 完全取不到 | 288 |
| 有图标,源码里没有计数器编号 | 69 |
| 只有老图标,什么都没计 | 0 |
一个都没有。七十五分钟的抓取,什么也没找到。
本来一秒钟就能做完的那次测量
stats2.gif 的尺寸是 13 × 14 像素。
它不是计数器,也不是带数字的徽章。它是一个小小的统计图标——正是当前样式库里 981 号设计所重现的东西,而 981 自己代码里的注释把它的前身描述得清清楚楚:不显示任何数字,只有一个小标记,点一下打开你的统计。它从来就不该计数。那些页面上一直另有东西在计数。
这个文件也没有坏。它以 200 应答,带着 2018 年的 Last-Modified 和一年的缓存期。它正在做它该做的事。
只要在最开头调一次 getimagesize(),整条调查线在工具写出来之前就会结束。可实际的问题是「为什么这个文件被取得这么频繁」,被接受的答案是「因为它是个坏掉的计数器」,之后的一切都建立在一个没人验证过的前提上。
唯一真正坏掉的东西
这一整轮里,日志只暴露出一处真缺陷:有一个网址每天被请求十次,全部返回 410,整段嵌入代码被塞进了一个链接的 href 里。有人把代码粘进了一个会转义 HTML 的输入框。他的计数器活得好好的,也在正常计数——坏掉的只是他自己那条指向自己统计页的链接。
工具留了下来,但去掉了写入路径。问题是正当的,答案是「没有」,两者都值得留着,免得以后还有人再手工问一遍。