用随机数据伪造JPEG图像:Spigot项目对抗恶意网络爬虫的新策略
2025年3月25日,一款名为Spigot的小型网络应用程序引起了一位开发者的注意。Spigot的主要功能是生成虚假的网页层级结构,使用马尔科夫链生成无意义的内容,供网络爬虫抓取。过去几个月,Spigot每天为其服务器上的网络爬虫提供了超过一百万页的内容。开发者偶尔会查看其日志,了解哪些爬虫访问得最为频繁。 近日,开发者注意到一个新的活跃爬虫“ImageSiftBot”正在每小时发送数千个请求,试图从Spigot获取图像。然而,Spigot生成的内容并不包含任何图像,这使得ImageSiftBot的努力看似徒劳。为了减轻服务器负载并增加对爬虫的反制手段,开发者决定让Spigot生成虚假的JPEG文件来回应这些请求。 生成真实的JPEG文件需要较高的CPU负载,尤其是在实时压缩像素数据时。为了解决这一问题,开发者考虑了一个巧妙的方法:利用现有JPEG文件的模板,保留文件结构部分(如尺寸、颜色深度等),而像素数据部分则用随机数据填充。这种方法可以生成看起来像是JPEG文件的数据,但实际内容是无意义的垃圾数据。这样不仅大大降低了CPU的使用率,还增加了爬虫的成本。 经过一番研究,开发者发现JPEG文件由多个 chunks 组成,每个 chunk 包含一个标记和长度。通过扫描自己网站上的514张JPEG图片,保留结构部分并记录像素数据部分的长度,得到了一个不到500KB的模板数据集。开发者随后编写了一些测试代码,发现大多数JPEG解析器都能接受这种随机填充的图像文件,尽管它们存在一些解码错误。 为了进一步优化,开发者在生成的像素数据中加入了位掩码(如对每个字节进行0x6D的 AND 操作),以减少无效的Huffman编码出现的概率。这样可以在几乎不增加CPU负载的情况下,显著提高生成的虚假JPEG文件的有效性。 目前,大约60%的Spigot生成页面会包含一张这样的虚假JPEG文件。ImageSiftBot已经对这种方法表现出极大的兴趣,今天一天就抓取了大约15,000张垃圾图像。其他爬虫如Meta的AmazonBot和GPTBot也开始表现出兴奋的情绪。开发者表示将对代码进行整理,并不久后在GitHub上发布这段不足100行的Python代码。 业内专家认为,这种做法是对抗滥用网络资源的网络爬虫的有效方法。通过低成本地生成大量垃圾数据,开发者不仅保护了自己的服务器资源,还增加了恶意爬虫的运营成本。开发者是一位独立工程师,致力于网络安全和技术研究,此前曾开发多个针对网络爬虫的防御工具。Spigot项目的成功展示了在网络防御中的创意和技术实力。