如何在不干扰真实用户的情况下阻止来自我的网站的恶意机器人?

Posted

技术标签:

【中文标题】如何在不干扰真实用户的情况下阻止来自我的网站的恶意机器人?【英文标题】:How to I block bad bots from my site without interfering with real users? 【发布时间】:2012-12-24 04:47:30 【问题描述】:

我想保留那些窃取内容并占用我网站带宽的不良爬虫程序(也就是定义上会忽略 robots.txt 的坏机器人)。同时,我不想干扰合法人类用户的用户体验,或阻止行为良好的机器人(例如 Googlebot)将网站编入索引。

这里已经描述了处理这个问题的标准方法:Tactics for dealing with misbehaving robots。但是,该线程中提出和赞成的解决方案不是我正在寻找的。​​p>

一些不良机器人通过 Tor 或僵尸网络进行连接,这意味着它们的 IP 地址是短暂的,很可能属于使用受感染计算机的人。

因此,我一直在考虑如何通过让 IP 被列入黑名单的“误报”(即人类)再次访问我的网站来改进行业标准方法。一个想法是完全停止阻止这些 IP,而是要求他们在被允许访问之前通过验证码。虽然我认为 CAPTCHA 是合法用户的 PITA,但使用 CAPTCHA 审查可疑的恶意机器人似乎比完全阻止对这些 IP 的访问更好。通过跟踪完成 CAPTCHA 的用户会话,我应该能够确定他们是人类(并且应该将他们的 IP 从黑名单中删除),还是智能到足以解决 CAPTCHA 的机器人,将他们置于更黑名单上。

但是,在我继续实施这个想法之前,我想问问这里的好人是否预见到任何问题或弱点(我已经知道一些 CAPTCHA 已被破坏 - 但我认为我应该能够处理)。

【问题讨论】:

堆栈溢出采用验证码方法。你注意到了吗?不?那么它就不是普通用户的 PITA。 该线程中的第二个答案也是一个好主意。 ProjectHoneyPot 是通过 DNS 解决问题的商业服务 (cloudflare.com) 的基础。 RBL 和 ProjH 之类的黑名单可以创造奇迹。 Bot 编写者非常老练,可以隐藏他们的踪迹、限制和频繁更改 IP。你永远不会阻止它们,每天都会出现一个新的。 @gview 那些限制机器人其实并不需要被阻止。 @JanDvorak 我认为阻止这些机器人真的不值得付出努力,直到它们干扰您为真正的访客提供服务的能力。让真正的访客生活困难是限制您成功的一种行之有效的方法。我永远不会用验证码打断观看。话虽如此,我在 Cloudflare 测试组中,它几乎消除了我正在测试它的站点的机器人流量。 @JanDvorak,是的,我肯定注意到了。关于它有多痛苦:YMMV - 我没有对此进行调查。我想听听对我提出的方法的批评,以及(我希望)改进它的建议。 【参考方案1】:

我认为问题在于验证码是否存在可预见的问题。在我深入探讨之前,我还想解决您计划如何捕捉机器人以使用验证码挑战它们的问题。 TOR 和代理节点会定期更改,因此 IP 列表需要不断更新。您可以使用Maxmind 作为您的基准的代理地址列表。您还可以找到更新所有 TOR 节点地址的服务。但并非所有坏机器人都来自这两个向量,因此您需要找到其他捕获机器人的方法。如果您添加速率限制和垃圾邮件列表,那么您应该会遇到超过 50% 的不良机器人。其他策略确实必须围绕您的网站定制。

现在谈谈验证码的问题。首先,有http://deathbycaptcha.com/ 之类的服务。我不知道我是否需要详细说明这一点,但这会使您的方法变得毫无用处。人们绕过验证码的许多其他方式都在使用 OCR 软件。 Captcha 在击败 OCR 方面做得越好,对您的用户来说就越难。此外,许多 Captcha 系统使用客户端 cookie,有人可以解决一次,然后上传到他们所有的机器人。 我认为最著名的是 Karl Groves 列出的 28 种击败 Captcha 的方法。 http://www.karlgroves.com/2013/02/09/list-of-resources-breaking-captcha/

为了全面披露,我是Distil Networks 的联合创始人,这是一个阻止机器人的 SaaS 解决方案。我经常将我们的软件作为一个更复杂的系统来宣传,而不是简单地使用验证码并自己构建它,所以我对你的解决方案有效性的看法是有偏见的。

【讨论】:

以上是关于如何在不干扰真实用户的情况下阻止来自我的网站的恶意机器人?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不干扰主数组的情况下以 7 角拼接数组中的元素

如何跟踪 IP 以阻止恶意用户?

计算机病毒

在不阻止的情况下发送批量通知电子邮件

禁止.preventDefault()无处不在

在不干扰平移的情况下向 MKMapView 添加左滑动手势