stats2.gif 到底是什么
本项目的图片目录里放着一个 stats2.gif。它有 366 字节,日期是 2018 年 3 月,在源代码里出现的次数正好是零。2026 年 8 月 23 日,它被以 200 状态送出 2735 次,来自 145 个不同的站点——把整轮访问日志算完,是 858 个。…
六个已完成的功能,以及回到它们的路
2026 年 8 月 23 日,本站回应了 101 461 个请求。在全部这些请求里,站长令牌——也就是打开统计页面上设置面板的那个 ?t=——出现了整整零次。 不是「很少」,是零。令牌背后的任何一个端点也没有收到过 POST:时区、阈值、排除、密码、找回、邮件,一个都没有。那天仅有的两类 POST,一类打向上一代服务留下的一个失效鼠标轨迹脚本,一类打向写入 AI…
我们如何少收数据地统计点击
计数器回答的是「来了多少人」。更有用的问题通常是「有多少人做了什么」——点了联系方式、打开了下载、去了社交主页。本服务从事件功能上线那天起就能做这件事:给元素加上 data-s4u-event="kontakt",落在它上面的点击就会以这个名字被计入。…
无需 Cookie 横幅的访问统计
多数分析工具需要一条同意横幅,因为多数分析工具会在访客设备上存东西:一个 cookie、一条本地存储、一个能活到明天的标识符。欧洲法律管得最直接的就是这个存储行为——也正是它让横幅必须在一切开始之前先出现。 这个计数器不在设备上存任何东西。没有 cookie,没有本地存储,什么都没有。这一点可以直接验证:浏览器脚本里找不到…
从 Stats4U 2 留下来的三个字段
这里的计数器主表有 166 436 行,还有若干看起来很要紧的字段。其中三个是 lastdomain、firstdomain 和 userdomain。它们里面装着数据: lastdomain 在 15 525 行里非空 firstdomain 在 15 457 行里非空 userdomain 在 2 982 行里非空…
我们不再收集屏幕尺寸
本服务以前会记录屏幕分辨率。浏览器脚本读取 window.screen,把它以 res=1920x1080 的形式一起发送,统计页面上也有一个对应的面板。 现在不记了。装这份数据的那张表今天有零行,面板显示的是它的空状态。脚本里进行读取的那一行,如今是一句说明当初写了什么的注释。 它为什么走了…
一个密码在低配硬件上要花多少
这里的统计页面可以加密码保护。给这个密码算哈希,是本服务里唯一一个应该慢的操作——正是它让一份被偷走的哈希变得难以攻破。问题只是:在这台硬件上,慢到什么程度。 在运行本站的那台机器上实测,PHP 8: PASSWORD_DEFAULT 560 毫秒 (解析为 cost 12) cost 12 595 毫秒 cost 11 277 毫秒 cost 10 138 毫秒…
排行榜怎么运作,以及怎么退出
stats4u.net从一开始就对访问最多的计数器进行排名——一篇2012年的文章当时就已经在讨论如何改进它。当前版本位于/top,其底层运作方式和当年已经不同:按30天访客数排名的25个计数器、一份将本周与上周对比的独立"fastest…
网站目录里的备份就是源码泄漏
动一个大文件之前,很自然的一步是先复制一份。cp index.php index.php.改之前,然后开工。如果这个文件躺在 Web 服务器对外发布的目录里,整份源代码就变成了可以当纯文本下载的东西——数据库凭据、密钥,文件里碰巧有的一切。 Apache 让 index.php 走 PHP,是因为它以 .php 结尾。index.php.改之前 不以 .php 结尾。它以…
新的隐私政策、条款和数据处理协议
截至2026年8月19日,stats4u.net的法律文件从原本的一份变成了三份:一份重新撰写的隐私政策、一份服务条款,以及——新增的——一份依据GDPR第28条订立的数据处理协议(DPA)。 为什么需要单独的DPA…
一个看起来像 Perl 的语言代码
2026年8月19日,我们在.htaccess里加了一条规则,用来拦截一类绝不应该被直接提供给浏览器的文件:编辑之后遗留在网站根目录里的源代码副本——比如index.php.bak、一个散落的config.py,或者任何带脚本扩展名、访客有可能以纯文本形式获取到源代码而不是让它运行起来的文件。…
每一次都把同一个文件压一遍
Apache 是即时压缩响应的。对一个每次都不一样的页面来说,这是唯一的办法。对一个一个月才改一次的样式表来说,这意味着服务器为每一位访客把同样的活儿重做一遍,一做几个星期,而且每次都把结果扔掉。这件事没有缓存。 2026 年 8 月 19 日在一条已建立的连接上实测,用的是本站自己的 style.css(124 kB)和 world.js(102 kB): 时间 字节…