16

我需要编写一些代码来分析我们网站上的给定用户是否是机器人。如果是机器人,我们将采取一些具体行动。除了友好的机器人之外,查看用户代理对于任何事情都不会成功,因为您可以在机器人中指定您想要的任何用户代理。我追求不友好机器人的行为。到目前为止,我的各种想法是:

  • 如果您没有浏览器 ID
  • 如果您没有会话 ID
  • 无法写入 cookie

显然,在某些情况下,合法用户看起来像机器人,但这没关系。是否有其他程序化方法来检测机器人,或者检测看起来像机器人的东西?

4

9 回答 9

9

用户代理可以被伪造。验证码已被破解。有效的 cookie 可以通过页面请求发送回您的服务器。Adobe Acrobat Pro 等合法程序可以在一个会话中进入并下载您的网站。用户可以禁用 JavaScript。由于没有“正常”用户行为的标准衡量标准,因此无法将其与机器人区分开来。

换句话说:除非将用户拉入某种形式的交互式聊天并希望他们通过图灵测试,否则无法做到,那么他们也可以成为一个非常好的机器人。

于 2008-12-04T19:13:53.747 回答
8

澄清你为什么要排除机器人,以及你对错误分类的容忍度。

也就是说,您是否必须以像对待机器人一样对待真实用户为代价来排除每一个机器人?或者,只要机器人不会对性能产生影响,它们是否可以抓取您的网站?

排除所有机器人的唯一方法是关闭您的网站。恶意用户可以将他们的机器人分发到足够多的机器上,以至于您无法将他们的流量与真实用户区分开来。JavaScript 和 CSS 之类的技巧不会阻止坚定的攻击者。

如果“快乐媒介”令人满意,一个可能有用的技巧是用 CSS 隐藏链接,这样它们在浏览器中对用户不可见,但仍在 HTML 中。遵循这些“毒药”链接之一的任何代理都是机器人。

于 2008-12-04T19:10:08.653 回答
3

一个简单的测试是javascript:

<script type="text/javascript">
document.write('<img src="/not-a-bot.' + 'php" style="display: none;">');
</script>

not-a-bot.php 可以在会话中添加一些东西来标记用户不是机器人,然后返回一个像素 gif。

URL 被分解以从机器人中伪装它。

于 2008-12-04T19:09:08.423 回答
3

这是一个想法:

大多数机器人不下载 css、javascript 和图像。他们只是解析html。

如果您可以在用户会话中跟踪他们是否下载了上述所有内容,例如通过记录尝试的脚本路由所有下载请求,那么您可以快速识别仅下载原始 html 的用户(很少普通用户会这样做)。

于 2010-05-25T08:51:08.087 回答
2

您说某些用户显示为机器人是可以的,因此,

大多数机器人不运行 javascript。使用 javascript 对将这个 IP 地址标识为 NonBot 的服务器进行类似 Ajax 的调用。将其存储一段时间,以将来自该 IP 的未来连接识别为良好客户端,并防止进一步浪费的 javascript 调用。

于 2008-12-04T19:08:18.597 回答
1

对于服务器上的每个会话,您可以确定用户是否在任何时候点击或输入速度过快。在给定的重复次数后,将“isRobot”标志设置为 true 并在该会话中节省资源。通常,您不会告诉用户他已被机器人检测到,因为在这种情况下他只会开始一个新会话。

于 2008-12-04T20:34:16.800 回答
0

嘿,谢谢大家的回复。我认为一些建议的组合会很好。主要是计算表单填写速度的隐藏表单元素,可能还有“毒链接”的想法。我认为它将涵盖大部分基础。当您谈论机器人时,您不会全部找到它们,因此认为您会......愚蠢的机器人是没有意义的。

于 2008-12-05T18:02:31.533 回答
0

好吧,这实际上是针对网站的特定页面的。我们不希望机器人提交表单 b/c 它会扰乱跟踪。老实说,友好的机器人、谷歌、雅虎等都不是问题,因为它们通常不会一开始就填写表格。如果我们怀疑某人是机器人,我们可能会向他们展示验证码图像或类似的东西......如果他们通过了,他们就不是机器人并且表单提交......

我听说过诸如将表单放入 Flash 或制作提交 javascript 之类的事情,但我不希望阻止真正的用户使用该网站,直到我怀疑他们是机器人......

于 2008-12-04T19:14:01.017 回答
0

我认为您检查会话 ID 的想法已经非常有用。

另一个想法:您可以检查是否也下载了嵌入式资源。

不加载图像(例如为了节省时间和带宽)的机器人应该与通常会加载嵌入页面的图像的浏览器区分开来。

然而,这样的检查可能不适合作为实时检查,因为您必须分析某种可能很耗时的服务器日志。

于 2008-12-04T19:15:06.147 回答