ITSWE博客

爬虫洪水防御复盘:七千九百次请求的一天

云池爬虫单日七千九、真实访客七十三。四段封禁、频控陷阱、住宅代理对抗、统计清污——一场完整战役的技术复盘。

凌晨,访问统计的曲线异常:单日请求量七千九百次,而这座站的真实日活不过几十人。拉开明细,一场持续数日的攻防就此展开。这篇是纯技术复盘。

画像:对面是谁

取证从三个维度交叉。身份维度:请求全部来自两家云厂商在境内的四个网段,网段内大量地址轮换;行为维度:浏览器标识伪装成新版桌面浏览器,但执行了页面脚本、会打统计信标——真 headless;路径维度:机械地翻页面历史、版本差异、日志分页,四分之三的流量打在全站最重的动态接口上。打最贵的页面,用最假的身份,这就是画像。

第一回合:封段与频控

云段封禁直接有效,但实现路上有两个深坑。

第一是真实客户端地址的还原。站点在边缘之后,请求经过协议层转发,源站看到的地址是边缘出口。把还原逻辑架在错误的一层,等于白防——第一版因此全军覆没,二十一分钟内误伤风暴,虽然核验后确认没伤到真人,但防线等于没建。第二版改从转发头取值:实测证明边缘对转发头是追加式的,伪造者只能把假地址写在前面,真实地址永远在最右——取最右,伪造无法绕过。

第二是限速组件的陷阱:修改限速的键变量后重新加载配置,系统不报错、回显成功,实际新配置没生效。后来立的规矩是:凡是改这类配置,不看回显,看工作进程的实际存活时间——进程没换新,就是没生效。

第二回合:对抗升级

对面三次变招。先是换段,新段照封。再是剥掉无头标记伪装普通浏览器——应对是条件封禁:无头标识加经边缘转发这两个条件同时满足才拒绝,直连流量豁免,这样自家的自动化测试管线不受影响。第一版正则还写错了匹配边界,靠四种组合的通断测试才校准。

最后是住宅代理池:全球家庭宽带地址轮转,每个地址只发二十条左右请求——精确卡在频控的突发预算之内,每一发都合法,每一发都恶心。频控按地址计,而对方让每个地址都只出现一次。

这一轮的应对是行为限速:对翻页类动态接口单独挂更严的速率,依据是当日实测——真搜索引擎一天一千多次访问里翻页类请求为零,所以收紧它们零误伤。再配合一刀最狠的:匿名状态请求编辑表单,直接拒绝——拉旧版编辑表单是真人零命中的最强签名。

第三回合:拍板

对面终局形态是剥标记加住宅池加每地址一发,所有按地址、按标识、按速率的防线同时失效。继续加码只剩两条路:封整个大段——误伤全体云厂商用户;或全站验证码——误伤所有真人。

站长的拍板是:放弃,让它爬。已建的防线维持,不再追加。这个决定我认为是对的:防御的目标是让攻击的成本高于收益,而不是消灭攻击。对面翻的是公开内容,无登录无写入,封无可封时,继续投入是把钱扔进无底洞。

取证工具箱

这场战役的取证沉淀成了一套可复用的工具习惯。其一,日志归档要全量扫:访问日志按天轮转,压缩归档在别处,只看当前文件会漏掉前一天的证据——所有历史分析必须从第一天扫到最后一天,我们吃过只看当天漏判的亏。其二,地址要还原后再分析:经过边缘转发的流量,源站看到的是边缘出口,必须按转发头还原真实客户端,而还原逻辑架错层等于白防——第一版防线因此二十一分钟内形同虚设。其三,画像要三维交叉:地址网段、浏览器标识、访问路径,单一维度都会被骗,三维同时吻合才定罪。其四,定罪前留一份反例核验:把判为机器的记录抽查真人特征、把放行的记录抽查机器特征,两个方向都要验证。

统计清污的口径细节

战役尾声的统计清污,细节比想象多。打标:一万二千多条机器事件批量更新标记字段,此后明细与排行实时过滤即得净数据。重算:每日趋势表按新口径重算九天,重算前先做库快照可回滚。坑也踩了两个:其一,事件表没有日期字段,拿文本日期和数字时间戳做比较永远为假,这种类型错位把一天的统计清过零,第二次踩才写进清单;其二,入库通道有批处理延迟,准点读数会少读最近半小时——判读流量以源站原始日志为准,看板是给趋势看的。

最终口径也一并固化:当日真实访客七十三人,爬虫占全站流量九成九;放行类别盘点里,计算器的访问量大头是离线应用的预缓存链条——所有首次访客都会触发,不是机器特征,这类“看起来像机器的正常行为”要专门登记,防止下次误伤。

防御的成本账

最后算一笔账,这是整场战役最值钱的产出。防御的每一层都有成本:封段有误伤云厂商全体用户的风险,验证码有驱赶真人的代价,更细的频控有开发与维护投入。而收益的边界很清楚——对面翻的是公开内容,无登录、无写入,数据上看它拿走的页面即便全部作废,损失也只是带宽。当继续加码的成本(误伤风险与维护投入)超过被拿走内容的损失时,理性选择就是停手。站长拍板放弃对抗的那句原话——“找的地址都不是正常人能用的”——背后其实是一笔算清了的账。安全投入的终点不是“消灭攻击”,是“攻击变得不划算”。

尾声:统计的清污

战役的最后一仗在统计系统:一万二千多条爬虫事件打上标记,九天的趋势数据按“剔除机器人”口径重算,重算后当天真实访客七十三人——此前图表上那七千九,百分之九十九是机器。顺带修正了两个误判:离线缓存的预加载链条是所有首次访客都触发的行为,不是爬虫指纹;某段混杂手机浏览器标识的地址,判定为共享出口,不定罪也不封禁。

这场战役真正留下的资产,是一套方法论:先画像后动手、每一层防御都做正反双向验证(伪造的该拦、真实的该放)、封禁对象要留证据、以及最重要的——知道什么时候该停手。

安全反爬
返回全部文章