如何在PHP中从用户代理字符串中检测浏览器欺骗和机器人。

8
到目前为止,我已经能够通过将这些字符串与已知的用户代理进行匹配,从用户代理字符串列表中检测机器人,但是我想知道还有哪些其他方法可以使用php来执行此操作,因为使用此方法检索到的机器人数量比预期的要少。
我还想了解如何通过用户代理字符串检测浏览器或机器人是否正在欺骗另一个浏览器。
非常感谢任何建议。
编辑:这必须使用以下格式的日志文件完成:
129.173.129.168 - - [11/Oct/2011:00:00:05 -0300] "GET /cams/uni_ave2.jpg?time=1318302291289 HTTP/1.1" 200 20240 "http://faculty.dentistry.dal.ca/loanertracker/webcam.html" "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.4; en-US; rv:1.9.2.23) Gecko/20110920 Firefox/3.6.23"
这意味着我无法检查用户行为以外的访问时间。

3
很不幸,无论你尝试多么努力,机器人仍将通过你实施的任何措施。 - noko
2
不可能的。你可以启发式地看它,但仅此而已。 - Brad
5个回答

12

除了在用户代理字符串中过滤关键词之外,我还尝试在所有页面上放置一个隐藏的蜜罐链接:

<a style="display:none" href="autocatch.php">A</a>

然后在"autocatch.php"中将会话(或IP地址)记录为机器人。此链接对用户不可见,但其隐藏特性有望不被机器人意识到。将style属性移除并放入CSS文件中可能会更加有帮助。


1
这种技术通过在输入类型为“hidden”的电子邮件中命名电子邮件并将真实可见的电子邮件表单字段称为其他名称,可以很好地捕获垃圾邮件发送者。隐藏链接的唯一缺点是可能会被Google标记为黑帽SEO。 - WebChemist
正如@WebChemist所说,这是很危险的。我们生活在一个世界里,智能和其他“正确”的解决方案通常是“错误”的解决方案,因为:Google。请非常小心隐藏链接。 - Bangkokian

6

正如之前所述的一样,由于可以伪造用户代理和 IP,它们不能用于可靠的机器人检测。

我在一家安全公司工作,我们的机器人检测算法大致如下:

  1. 步骤 1 - 收集数据:

    a. 交叉核对用户代理 vs IP。(两者都需要正确)

    b. 检查头部参数(缺少什么,顺序是什么等等...)

    c. 检查行为(早期访问和遵守 robots.txt,一般行为,访问页面数量,访问率等等)

  2. 步骤 2 - 分类:

    通过交叉验证数据,机器人被分类为“好的”,“坏的”或“可疑的”。

  3. 步骤 3 - 主动挑战:

    可疑机器人经过以下挑战:

    a. JS 挑战(能否激活 JS?)

    b. Cookie 挑战(能否接受 cookie?)

    c. 如果仍然不确定 -> CAPTCHA

这种过滤机制非常有效,但我认为单个人甚至是非专业提供商都无法复制它(首先,挑战和机器人数据库需要安全团队不断更新)。
我们提供一些“自助工具”,以Botopedia.org的形式提供目录,可用于IP /用户名交叉验证,但对于真正高效的解决方案,您必须依赖专业服务。
有几种免费的机器人监控解决方案,包括我们自己的解决方案,大多数都将使用我上面描述的相同策略(或类似策略)。
祝好运。

4

除了比较用户代理外,您还需要记录活动并查找机器人行为。通常,这将包括检查 /robots.txt 并不加载图像。另一个技巧是询问客户端是否具有 JavaScript,因为大多数机器人不会将其标记为已启用。

但是,请注意,您可能会意外地得到一些真正的人。


1
我需要澄清一下:我必须使用用户代理日志文件来完成此操作,因此无法检查JavaScript或加载的图像,但感谢您的帮助。 - user1422508
那么你需要发布日志,否则我不知道你有哪些信息可以使用。 - Kyros
原始帖子已经编辑,附上了日志文件中的一行示例。实际文件包含超过70000行,但它们的结构类似于此。 - user1422508

2
不,用户代理可以伪造,因此不可信。
除了检查Javascript或图像/CSS加载外,您还可以测量页面加载速度,因为爬虫通常会比任何人类访问者快得多。但这仅适用于小型网站,受欢迎的网站可能有很多访问者在共享的外部IP地址后面(大型公司或大学校园),他们可能以类似机器人的速度访问您的网站。
我想您还可以测量它们加载的顺序,因为机器人会按照先到先爬的顺序爬行,而人类用户通常不符合该模式,但跟踪起来会更加复杂。

没问题,这是我帮助另一个用户制作阻止过多机器人页面加载的阻塞脚本的帖子,你可能可以根据自己的需求进行调整。http://webmasters.stackexchange.com/questions/35171/number-of-page-requests-by-any-bot-in-5-secs - WebChemist

1

你的问题涉及使用用户代理字符串进行检测。正如许多人提到的那样,这可以被欺骗。

为了了解欺骗的可能性,并了解检测的难度,建议您最好学习使用cURL的PHP技术。

基本上,使用cURL几乎可以欺骗浏览器(客户端)请求中发送的所有内容,但IP地址是一个明显的例外,即使在这里,一个决心欺骗的人也会隐藏自己的IP地址,以消除您检测他们IP地址的能力。

不用说,每次请求时使用相同的参数将使欺骗者易于被检测出来,但是使用不同的参数轮换将使欺骗者很难,甚至无法在真实的流量日志中检测到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接