用钓鱼的方法收集非法爬虫的 IP 地址

用钓鱼的方法收集非法爬虫的 IP 地址

前言

最近几个月,我都有研究对抗有害爬虫的方法。我收集到来自几十个不同 ISP 的爬虫,有些已经确认并关联了相关的应用(例如所谓的 AI 搜索产品),有些还在等待调查。

在本文我将分享一些获取这些有害爬虫 IP 的方法,并预告一些我针对它们采取的措施。

有害爬虫

首先我们要定义一下,为何非法,又为何有害。很简单,模拟真实用户的爬虫,必然是非法的爬虫。这类爬虫甚至没有提供屏蔽它们的方法,更不要提遵循 robots.txt 了。

如何界定非法爬虫是否有害?首先要搞清楚,这里的有害是对谁有害,当然是对我们即网站的所有者有害了。例如某些 AI 产品,它们通过非法爬虫抓取我们的数据,然后向他们的用户展示从我们这里复制、总结的内容。这甚至是损人利己的(我如何看待 AI 抓取我的博客)。

既然损害我们的利益,它当然就是有害的爬虫。对于这类有害的爬虫,是必须对抗甚至惩治的。一般的方法对他们无效,因为他们几乎不遵循任何规则,所以我们需要一些特殊的方法。

钓鱼

由于这些爬虫程序是模拟真实用户请求的,我们无法通过 User-Agent 或其它头信息做判断。有些爬虫可以相当深度的模拟,例如通过 TLS 指纹识别。有时候 Cloudflare 的防护对它们都无效,这取决于爬虫开发者的能力(不要怀疑,我就可以做到)。

所以我们要切换思路,不再检测它们,而是“诱惑”它们。为它们定制一些蜜罐网页,让它们自投罗网。落入陷阱的爬虫的 IP,我们就可以直接屏蔽了。这是针对各种的未知非法爬虫非常有效一种思路。

隐藏链接

我们可以添加一些隐藏链接,避免用户访问,但又让爬虫很容易的获取到它。最典型的方式,就是把链接加入到网站地图(Sitemap)中。不要添加任何内链,所以用户是访问不到的。例如:

https://example.com/posts/11e06c47-0e54-4797-ad33-dddcdfca0803.html

2024-10-25T05:05:26+08:00

网站地图(Sitemap)用于告诉搜索引擎网站的结构,是 SEO 必备的文件。搜索引擎(包括其它用途的爬虫)会定期访问这个文件,以获取网站的最新和已修改的链接条目。

我们甚至都不需要确保 /posts/11e06c47-0e54-4797-ad33-dddcdfca0803.html 这个页面是存在的。因为即使不存在,那也得访问过后才知道。非法爬虫为了第一时间获取我们的所有网页,会经常光顾我们的 Sitemap。但没有用户会这么做,所以 Sitemap 就是一个天然的鱼池。

我们将该页面的所有访问记录收集起来,它们基本上全部都是爬虫。然后就可以进一步的分析它们的请求特征、IP 地址等信息。

如果你担心爬虫看不到这个链接,可以放在页面中。例如每个页面都会包含的页脚部分。但用样式隐藏起来,让用户不可见也无法点击。

结合 robots.txt

以上的钓鱼链接有一个弊端,就是无法区分合法和非法爬虫。到时候 Google 和 Bing 等搜索引擎也会访问该页面。由于该页面不存在,还可能给你报告一些错误。并且两类爬虫混淆在一起,你不得不做一个筛选的过程。但如果你将隐藏链接和 robots.txt 结合起来,就可以直接区分这两类爬虫。

我们在 robots.txt 中添加如下内容:

Disallow: /*?bad_bots_block

接着修改 Sitemap 中的钓鱼链接:

https://example.com/posts/11e06c47-0e54-4797-ad33-dddcdfca0803.html?bad_bots_block

2024-10-25T05:05:26+08:00

如上所示,我在链接后面添加了 bad_bots_block 参数,但这个参数同时又在 robots.txt 中禁止。所以 Google 和 Bing 等正规搜索引擎的爬虫并不会抓取这个链接,因为它被规则屏蔽了。而非法爬虫不会管这些,有新链接它就访问。

所以呢,现在凡是有 /posts/11e06c47-0e54-4797-ad33-dddcdfca0803.html?bad_bots_block 访问记录的,不用筛选,几乎可以直接判定为非法爬虫。

陷进表单字段

这里假设你要对抗的是会进一步模拟用户操作的非法 bot。例如它会模拟注册帐号、提交垃圾信息等,任意一种涉及表单提交的都可以。

接着我们通过样式隐藏蜜罐字段,但不要使用 display: none 或 visibility: hidden 这些显而易见的隐藏方式。因为爬虫可以轻易的从样式中判断元素被隐藏了。

.hidden-field {

position: absolute;

width: 1px;

height: 1px;

padding: 0;

margin: -1px;

overflow: hidden;

clip: rect(0, 0, 0, 0);

white-space: nowrap;

border: 0;

}

我们把元素压缩到最小尺寸,故意移出容器会因溢出而被剪裁掉。虽然对用户是不可见的,但仍然实际存在。

一旦检测到 username 字段被填写了,那么这个提交请求就是非法 bot。因为正常用户是看不到这个字段的,所以也无法填写。接着我们在前端/后端中读取蜜罐字段的值,即可判断是否是非法 bot。

如果你想收集 IP,那就不要在前端阻止。

后期对抗

有了非法爬虫 IP 后,我又进行了一些筛选。首先,我会尝试找出该爬虫对应的应用,如果是 AI 搜索、AI 大模型这类产品,我可能会直接投毒。即对它们的 IP/CIDR 或 ISP 响应“定制”后的内容。实际上我已经对某些产品这么做了,并且取得了一些十分滑稽的效果。当我公开相关工具时,我会展示这些效果。

其余的爬虫,虽然非法但是无害的,我会视情况而定。如果是能给我带来流量的,我可能会放过。其余的一律返回乱码。这也是我近期正在开发的工具的功能。

相关工具已发文:点此阅读。

结束语

这就是收集非法爬虫 IP 的一些方法了。后续我还会继续补充新的教程,并公开一些使用有害爬虫的实际产品(AI 搜索是重灾区)。并提供针对这类爬虫的工具。敬请期待。

相关文章

三星 Gear VR 4代 VR眼镜使用总结(操作|售价)
365bet会员登录

三星 Gear VR 4代 VR眼镜使用总结(操作|售价)

📅 07-23 👁️ 458
袖的五行属性
365bet会员登录

袖的五行属性

📅 10-01 👁️ 5664
Liberon 超细钢丝绒 (0000) 100g
365bet会员登录

Liberon 超细钢丝绒 (0000) 100g

📅 12-27 👁️ 3343