有意思,网站被刷流量了
本文最后更新于 2025年9月24日 晚上
发现端倪
晚上没事干,随手看了一眼阿里云移动端 APP 上的账单,不看不知道,一看吓一跳,这个月的流量费用比上个月的多了十几块。虽然听上去好像没几个钱,但是对于我这种纯公益的极小业务,正常一个月就七八块的流量费,况且这个月还有一周多。感觉不对劲,急忙下床开电脑查看,好家伙,OSS 的外网流出流量和请求量都远超上个月的水准:
按理来说我的网站都是以学习内容为主的,即使是刚开学,也不可能会有这么大的流量增量。而且请求次数的增量和外网流出的增量比例也对不上,所以肯定是出啥事了。
开始调查
网页流量:
图床流量:
网页文件访问次数统计:
图床的文件访问次数统计:
有点猫腻,看来资源请求情况和我的博客网站有关。
当前的图床访问情况:
昨天的图床访问情况:
近七天的图床访问情况:
由于我的网站首页会自动加载这 6 张图片,确定攻击方式为:直接访问博客网站的首页然后自动加载图床的 6 张图片来刷我的流量。
揪出黑手
由于默认日志保存的信息有限,为了揪出幕后黑手,我开通了 OSS 的实时查询服务来获得更仔细的日志信息:
固定主机和资源后查看访问 IP:
可以看到,同一个 IP 段,不断地访问我的资源。采用了 IP 轮询的手段:
查询该网段的信息,发现是徐州的电信数据中心,和一开始的流量源一致,破案。
解决方案
显然,直接封禁对应的 IP 网段即可,即 58.218.211.0/24
。但技术手段上就有点麻烦了,这需要从我的网站架构说起。
网站是纯静态网页,资源是图床的形式(即 URL 的索引方式)。网页和资源都被我存储在了 OSS 中,并将其分别存储在不同的 Bucket 中以便于后续的管理和扩展。显然,网页不能被刷多少流量,因为一个网页才 1 MB 左右,流量大头是图片。由于网页会自动加载其中的图片资源,所以攻击者直接访问我的网页就会加载比较多的资源,这就给攻击者以可乘之机。
由于 OSS 不支持直接封禁 IP(需要开通 CDN 服务,我不想掏这个钱),仅仅支持防盗链(即修改 Referer),所以对于我的网站架构,真想恶意刷流量那方法不要太多,我能想到的就有以下两种攻击方法:
- 直接访问我的网页,然后网页自动加载图片从而消耗资源(这种方法最简单,效率也最高);
- 直接访问我的图片,从而消耗大量资源(这种方法比较麻烦,需要获得所有图片的 URL 才行)。
当然,阿里云提供了什么 WAF 服务,但那个成本就太高了,玩不起,贫穷的我就开始想别的方法。
对于第一种攻击方法,我的解决思路如下:
- 最卑微的,把大图片进行无损压缩。当然这很不通用,也很麻烦,需要动文档中的很多东西;
- 开通阿里云的 CDN 服务,然后封掉对应的 IP。这也不通用,因为依赖于 CDN 服务,需要花费额外的钱;
- 【我实施的】将网页从 OSS 转移到服务器上。这种方法相对合适点,因为转移到服务器后可以利用 Nginx 等网关很方便地封掉对应的 IP。代价是用户加载网页会受到一定的影响,这取决于服务器的性能和区域,同时按量付费的服务器的流量相较于 OSS 的流量要贵一点,目前阿里云的价格是:服务器流量费为 0.8¥/GB,而 OSS 流量费为 0.5¥/GB(夜间 0.25¥/GB)。
对于第二种攻击方法,我的解决思路如下:
- 可以直接利用 OSS 的防盗链功能,禁止空的 Referer 请求。这种方法最简单,不需要各种折腾,但是不方便的地方就是我本地就没法查看 OSS 的图片了,因为各种 Markdown 编辑器加载图床的图片时发送的请求都是空的 Referer;
- 暂时还没想出其他方法。
意外发现
经过我的测试,Windows 的截图系统调用会对 PNG 图片自动进行最大程度的压缩。具体可以在我提的 Issue 看到。下图为同样的照片的不同输出结果:
上图是我用 Snipaste 开启不压缩截图后输出的结果,占用的存储为 681 KB;下图为 Typora 直接从剪贴板读取的图片输出的结果,占用的存储空间减小到了 21 KB,两张图的视觉效果是一致的,这也印证了 PNG 的无损压缩理论。所以后面在使用 Snipaste 时,直接输出最大压缩的图片即可。