背景
爬虫是一直存在的一个行为,为了避免机器的爬取导致的服务器压力,可以考虑采用 zipbomb【你爬取我网站,那我就攻击你】。
zip 炸弹是一个相对较小的压缩文件,可以扩展成一个非常大的文件,这可能会使机器不堪重负。
通过利用 Web 的 gzip压缩功能来实现。一般为了压缩最大化带宽,抓取Web的机器人一般都支持 gzip。当检测到恶意攻击或网络爬虫时,返回 200响应,并提供 gzip响应。
Content-Encoding: deflate,gzip
发生的情况是,他们收到文件,读取 Headers,告诉他们这是一个压缩文件。因此,他们尝试解压缩 1MB 文件以查找他们正在寻找的任何内容。但是文件会不断扩展,再扩展,直到内存耗尽并且服务器崩溃。1MB 文件解压缩为 1GB。这足以破坏大多数机器人。但是,对于那些不会停止的讨厌的脚本,我会为它们提供 10MB 的文件。这个解压缩为 10GB 并立即杀死脚本。
创建 zip炸弹的方法
dd if=/dev/zero bs=1G count=10 | gzip -c > 10GB.gz
别轻易尝试,解压出来会特别大哦,10GB的文件大小。 解释一下:
1. dd if=/dev/zero bs=1G count=10
dd:数据复制工具,常用于底层数据操作。if=/dev/zero:从/dev/zero设备读取数据(该设备会无限生成二进制零0x00)。bs=1G:每次读取/写入的块大小为 1GB。count=10:总共处理 10 个块。- 效果:生成 10GB 的零数据流(10 块 × 1GB/块)。
2. |(管道)
- 将
dd的输出(10GB 零数据流)传递给gzip -c。
3. gzip -c
gzip:压缩工具,默认使用 gzip 算法。-c:将压缩结果输出到标准输出(而非直接写入文件)。- 效果:将 10GB 的零数据压缩为极小的数据流(零的重复性极高,压缩率接近 100%)。
4. > 10GB.gz
>:重定向操作符,将左侧命令的输出写入右侧文件。- 效果:将压缩后的数据保存到
10GB.gz文件中。
实际结果
- 文件内容:全零数据(
0x00)的压缩版本。 - 文件大小:
- 原始数据:10GB(未压缩)。
- 压缩后:约 10MB 以下(实际测试约为 10-20KB,具体取决于压缩算法实现)
使用
if (ipIsBlackListed() || isMalicious()) {
header("Content-Encoding: deflate, gzip");
header("Content-Length: "+ filesize(ZIP_BOMB_FILE_10G)); // 10 MB
readfile(ZIP_BOMB_FILE_10G);
exit;
}
解释: 因为全零流数据,所以10GB文件仅有 10MB大小,而爬虫机器人会依赖任务直接解压。从而你懂得,一般的机器也就崩了。