1. 首页>>分享

爬虫横行时代,他竟用6美元小服务器扛下Hacker News热榜流量并反制爬虫

在如今这个爬虫肆虐的时代,越来越多开发者深受其害 ,有人愤怒指责OpenAI的爬虫疯狂窃取数据 ,致使一个由7人团队历经十年心血打造的网站一夜之间崩溃 ,还有人被爬虫逼到绝境 ,最终只能封禁整个巴西地区的访问才勉强止住损失 。但本文作者选择了一条全然不同的路径,他凭借自身力量,借助一台每月只需 6 美元的破旧服务器,成功承受住了 Hacker News 热榜引发的流量冲击,还顺便反击了那些恶意爬虫,利用“zip 炸弹”使其失效。至于他是如何达成这一切的,我们不妨一同探究。

原文:

[id_957459128]

出品 | CSDN(ID:CSDNnews)

背景

我叫 Ibrahim Diallo,是一名软件开发者,居住在加州。自 1992 年起,我便开始“摆弄电脑”,从事破解系统、编写代码等工作。如此这般持续了几十年,直至如今仍未停歇。

平时我会写些博客,用来分享技术观察以及一些个人思考。谁能想到多年前刚开始写博客没多久,就因为一篇意外走红的文章,遭遇了前所未有的流量冲击,这冲击直接让文章冲上了Hacker News和Reddit热榜。

图片

文章登上 HN 首页的时候,我的那台小服务器立刻崩溃了,请求如潮水般涌来,Apache 服务器艰难地运转着,我坐在电脑前一次次重启它,就如同拿着喷水枪去扑灭森林大火,根本招架不住,这种“被热度压垮”的情形,在互联网圈子里有个形象的说法叫“死亡之拥”(Hug of Death) 。

到底访问量达到了怎样的程度,服务器承受的压力有多大呢?说实话,真的很难用语言来进行描述。

直到今年二月,我写了一篇文章,没过多久,这篇文章登上了 Hacker News 第一名。不过这次我有准备:提前保存了服务器的日志,还专门制作了一段可视化动画,展示那台每月花费 6 美元的小服务器,是如何扛住这波流量洪水的。

图片

上面这个动画之中,每一个网页请求都由一个小圆点进行表示,小圆点朝着服务器移动,右下角存在图例进行说明 。

200 OK是一种HTTP状态码,它表示网页请求成功了,服务器已经正常返回了你要的内容,这种情况意味着请求成功 。

- 重定向:用晃动的小圆点表示

- 404 Not Found:红点会掉出屏幕

- zip Bombs:这个后面再解释

[id_1033558709]

文章爆火后,现场一度陷入混乱,然而我那台小服务器却始终保持稳定。这台服务器每月花费仅6美元,其配置十分简单,仅有1GB内存,运行着Apache 2和一个简单的MySQL数据库。它没有云服务,没有自动扩容功能,也没有负载均衡器,完全依靠轻量化配置以及合理的缓存策略来应对流量洪峰。

服务器配置如下:

我的博客基于一个自建框架,大部分页面内容提前缓存到了memcached中,数据库每小时只查询一次页面,大大减轻了负担,这套方案在过去几次流量高峰时也都撑住了。

来看一下这次文章爆火的时间线:

关键点出现了,服务器自始至终都没有出现宕机的情况,甚至CPU使用率都没有达到16%!

不过你在动画里或许留意到一个怪异的现象,明明是1GB内存的小型服务器,可内存为何始终被占用了大概一半呢?原因实际上非常简单,是MySQL在承担这个责任 。

当年博客刚上线的时候,我满怀雄心壮志,记录下每一条请求,将这些请求写入数据库日志表,目的是追踪哪些文章最为受欢迎。这个方法在当时确实非常实用,然而,12年过去了,数据越积越多,想要从中查找某些东西,反倒变成了成本高昂的操作。

这次流量冲击过后,我对日志表进行了备份,随后将其彻底删除。现在是时候和那段历史告别了。

对了,你或许在可视化动画当中看到了一些“小爆炸”的效果,现在就来对其进行解释,说明一下那究竟是怎么回事…

有一天,我偶然发现一个网站在实时窃取我博客的内容,每当有人访问他们的页面,他们便立刻爬取我最新的文章,接着删掉我的名字和品牌标识,随后假装这些文章是他们自己所写。

一开始,我尝试进行“手动反击”,也就是故意给他们提供一些假数据,使得他们搬错内容。然而没过多久,我便觉得这种方式太过麻烦,于是干脆拿出了我的秘密武器,即“zip炸弹”。

这个“炸弹”的工作原理如下:当他们的爬虫访问我的网站,我便返回一个看似没什么问题的小压缩文件。他们的服务器会乖乖下载并尝试解压。结果如何呢?几GB的“垃圾”文件瞬间释放,系统直接崩溃了。

就这样,游戏结束。

什么是“zip 炸弹”?为什么能“反杀”爬虫?

这些年,“zip炸弹”成了我最有效的工具,用来对付各种恶意爬虫,比如偷内容的自动程序,探测漏洞的自动程序,发垃圾信息的自动程序。

要清楚,互联网上的流量,实际上大多源自这些机器人 。其中一部分是“友好”的 ,诸如搜索引擎 、RSS订阅器 ,又或是当下很火的用于大模型训练的爬虫 。然而也存在不少恶意的 ,比如发送广告 、偷取文章 ,甚至是入侵网站的脚本 。我曾在工作中碰到过这样的情况:有个爬虫察觉到我们WordPress的漏洞,它在服务器里悄悄植入恶意代码,致使网站沦为黑客控制的攻击工具;还有一回,我的网站被爬虫充斥了大量垃圾内容,最终直接被Google搜索下架。

从那以后我便意识到,得对这些爬虫展开“反击”,zip炸弹是我找到的最佳方案中的一个。

简单来说,zip炸弹是一种体积超小的压缩文件,解压之后它会变成一个巨大的文件,这个巨大的文件能致使处理它的系统崩溃 。

在互联网早期,gzip压缩是一个很早就被引入的功能,当时网速慢,信息密度高,人们希望尽可能压缩数据再进行传输,例如一个50KB的HTML文件,经过gzip压缩后可能只剩10KB,能节省40KB的传输量,在拨号上网时代,这意味着页面加载时间从12秒减少到3秒。

这种压缩技术可用于传输CSS,可用于传输JavaScript,还可用于传输图像文件。Gzip的优势是快速,Gzip的优势是简单,Gzip能显著提升浏览体验。浏览器发出请求时,会在请求头中表明自己支持压缩。若服务器也支持,就会返回经过压缩的数据版本。

Accept-Encodinggzip, deflate

爬虫程序也会有节省资源的想法,我正是利用爬虫程序的这一想法来“反制”它们。

反击过程:用压缩包“让你解压到崩溃”

在我的博客上,常常会碰到一些机器人扫描安全漏洞,一般情况下我不会在意。可是当我发觉它们企图进行恶意攻击,或者在试探服务器响应时,我就会返回一个看似正常的响应(例如200 OK),并且提供一个经过gzip压缩的文件。

我会提供一个大小在1MB到10MB之间的文件,它们会很高兴地接受。一般来说,一旦它们接收了这个文件,我就再也没看到它们出现过。这是为什么呢?是因为它们在解压文件后直接崩溃了。

Content-Encoding: deflate, gzip

具体发生的事情如下:机器人收到文件,读取文件头,发现这是一份压缩文件,于是尝试解压这个1MB的文件以查找其中内容,然而文件不断扩展,直至内存耗尽、服务器崩溃,这个1MB的压缩文件实际会被解压为1GB,多数机器人在此过程中会崩溃。要是碰到那些死缠烂打的脚本,我就给它们发送10MB的版本,这个版本会解压成10GB,进而直接“秒杀” 。

在告诉你怎样制作zip Bomb之前,我要提醒一下,这确实有可能致使你自己的设备崩溃,甚至造成损毁,要是继续操作,需自行承担风险。

下面是创建 zip Bomb 的方法:

dd if=/dev/zero bs=1G count=10 | gzip -c > 10GB.gz

这个命令的作用如下:

我在自己的服务器上,编写了一个中间件程序,该程序能够自动识别出哪些请求属于恶意请求 。

我维护着一个黑名单IP列表,该列表专门记录那些反复扫描整个网站的地址,同时还有一些启发式策略用于检测垃圾信息发送者,很多垃圾脚本会在发完内容后再次访问页面,查看内容是否成功插入,我正是利用这个行为模式来识别它们。

当系统判断出请求是恶意的,就触发如下逻辑:

if (ipIsBlackListed() || isMalicious()) {    header(内容编码为deflate,内容编码为gzip 。);    header("Content-Length: " . filesize(ZIP_BOMB_FILE_10G)); // 10MB    readfile(ZIP_BOMB_FILE_10G);    exit;}

就是如此容易。我仅需“发送”一个10MB的文件,便有可能致使对方服务器瘫痪。要是哪天我的文章陡然走红、访问量急剧增加,我就将炸弹换成1MB的“精简版”,应对低端爬虫也全然充足。

Zip Bomb 并不是万能的

最后再补充一点:zip 炸弹并不是万能的。

高级一点的爬虫能够识别压缩文件,能提前进行限制,比如只读取一部分或者禁止解压,如此便能绕过炸弹。然而那些“低级无脑乱爬”的脚本,就很容易中招了。

我所需要的,是一种防御手段。这种防御手段成本低,效果好。对于这种级别的威胁而言,“zip炸弹”已足够应对。

本文采摘于网络,不代表本站立场,转载联系作者并注明出处:http://www.mjgaz.cn/fenxiang/275771.html

联系我们

在线咨询:点击这里给我发消息

微信号:13588888888

工作日:9:30-18:30,节假日休息