程序化机器人检测
Posted
技术标签:
【中文标题】程序化机器人检测【英文标题】:Programmatic Bot Detection 【发布时间】:2010-09-25 09:30:52 【问题描述】:我需要编写一些代码来分析我们网站上的给定用户是否是机器人。如果是机器人,我们将采取一些具体行动。除了友好的机器人之外,查看用户代理对于任何事情来说都是不成功的,因为您可以在机器人中指定您想要的任何用户代理。我追求不友好机器人的行为。到目前为止,我的各种想法是:
如果您没有浏览器 ID 如果您没有会话 ID 无法写入 cookie显然,在某些情况下,合法用户看起来像机器人,但没关系。是否有其他程序化方法来检测机器人,或者检测看起来像机器人的东西?
【问题讨论】:
一个像样的机器人可能会拥有你提出的所有这些东西。它们的系统将自己表示为标准浏览器,或者它们将具有唯一的名称。他们将能够编写 cookie 以及进行会话。 我编写了一个可以愚弄所有这三个的机器人。处理 cookie 或浏览器 ID 并不难。 制作鼠标事件?机器人没有老鼠。 如果机器人是用户脚本怎么办?然后它有一个会话 ID、浏览器 ID 等。 【参考方案1】:您说有些用户显示为机器人是可以的,因此,
大多数机器人不运行 javascript。使用 javascript 对将这个 IP 地址标识为 NonBot 的服务器进行类似 Ajax 的调用。将其存储一段时间,以将来自此 IP 的未来连接识别为良好客户端,并防止进一步浪费 javascript 调用。
【讨论】:
【参考方案2】:一个简单的测试是javascript:
<script type="text/javascript">
document.write('<img src="/not-a-bot.' + 'php" style="display: none;">');
</script>
not-a-bot.php 可以在会话中添加一些东西来标记用户不是机器人,然后返回一个单像素 gif。
URL 被分解以伪装成机器人。
【讨论】:
唯一的困难是很多用户现在出于安全考虑关闭了 javascript。这几乎是幽默的,这将是测试真实性的最简单方法之一。 真的吗?关闭 javascript 后,现在有很多网站无法运行。我认为随着时间的推移,越来越多的用户在运行 javascript。 使用 Firefox 时,我大多数时候都没有激活脚本。因此,访问具有此类设置的站点会从一开始就将我标记为机器人。 @zachary,“问题”是现在越来越多的优秀 Web 开发人员正在使用渐进增强来至少提供一半体面的体验,所以 NOSCRIPT 显然(尽管我从未尝试过)可行的解决方案。我希望人们不要那么偏执。它使许多原本简单的事情变得令人沮丧地困难 人们偏执是有原因的。现在有很多安全漏洞是通过 javascript 开始或传播的(XSRF 现在是一个巨大的漏洞)。如果更多的 Web 开发人员在他们的客户端-服务器交互中进步,那么偏执的可能性就会降低(但仍然是有道理的)。【参考方案3】:阐明您为什么要排除机器人,以及您对错误分类的容忍度。
也就是说,您是否必须以像对待机器人一样对待真实用户为代价来排除每个机器人?或者,如果漫游器抓取您的网站,只要它们不影响性能,是否可以?
排除所有机器人的唯一方法是关闭您的网站。恶意用户可以将他们的机器人分发到足够多的机器上,以至于您无法将他们的流量与真实用户区分开来。 JavaScript 和 CSS 之类的技巧不会阻止坚定的攻击者。
如果“快乐媒介”令人满意,一个可能有用的技巧是用 CSS 隐藏链接,这样它们在浏览器中对用户不可见,但仍在 html 中。遵循这些“毒药”链接之一的任何代理都是机器人。
【讨论】:
如果用户安装了某种网络加速器,如果网络加速器不是非常智能,它仍然可能访问不可见的链接。【参考方案4】:用户代理可以被伪造。验证码已被破解。有效的 cookie 可以通过页面请求发送回您的服务器。 Adobe Acrobat Pro 等合法程序可以在一个会话中进入并下载您的网站。用户可以禁用 JavaScript。由于没有标准衡量“正常”用户行为,因此无法将其与机器人区分开来。
换句话说:除非将用户拉入某种形式的交互式聊天并希望他们通过图灵测试,否则他们也可能是一个非常好的机器人。
【讨论】:
【参考方案5】:嗯,这确实适用于网站的特定页面。我们不希望机器人提交表单 b/c 它会扰乱跟踪。老实说,友好的机器人、谷歌、雅虎等都不是问题,因为它们通常不会一开始就填写表格。如果我们怀疑某人是机器人,我们可能会向他们展示验证码图像或类似的东西......如果他们通过了,他们就不是机器人并且表单提交......
我听说过诸如将表单放入 flash 中或制作提交 javascript 之类的事情,但我不希望阻止真正的用户使用该网站,直到我怀疑他们是机器人...
【讨论】:
【参考方案6】:我认为您检查会话 id 的想法已经非常有用了。
另一个想法:您可以检查嵌入式资源是否也被下载。
不加载图像(例如为了节省时间和带宽)的机器人应该与通常会加载嵌入页面的图像的浏览器区分开来。
但是,这样的检查可能不适合作为实时检查,因为您必须分析某种可能很耗时的服务器日志。
【讨论】:
IE和火狐至少有不下载图片的能力。 Safari 也有禁用图片的选项。 猞猁。别忘了猞猁。没有人使用。但是哪个可以提交表单。是的…… 是的,没有完美的方法。但我想结合使用几种方法,例如检查脚本、图像下载、CSS 技巧等,你可以让邪恶的机器人变得更加困难......【参考方案7】:对于服务器上的每个会话,您可以确定用户是否在任何时候点击或输入速度过快。在给定的重复次数后,将“isRobot”标志设置为 true 并在该会话中节省资源。通常,您不会告诉用户他已被机器人检测到,因为在这种情况下他只会开始一个新会话。
【讨论】:
这不是万无一失的,因为存在许多合法的软件解决方案来代表用户自动填写网络表单。 好吧,没有什么是万无一失的,但是您再次为该会话提供略低的 QOS。我们只会在几页不人道的快速行为之后才这样做【参考方案8】:您好,感谢您的所有回复。我认为结合一些建议会很好。主要是计算表单填写速度的隐藏表单元素,可能还有“毒链接”的想法。我认为它将涵盖大部分基础。当你谈论机器人时,你不会找到所有的,所以没有必要认为你会......愚蠢的机器人。
【讨论】:
好吧,除了谷歌之外的“愚蠢的机器人”——没有它,许多网站根本不会获得任何流量:)【参考方案9】:这是一个想法:
大多数机器人不下载 css、javascript 和图像。他们只是解析 html。
如果您可以在用户会话中跟踪他们是否下载了上述所有内容,例如通过通过记录尝试记录的脚本路由所有下载请求,您可以快速识别仅下载原始 html 的用户(很少有普通用户会这样做)。
【讨论】:
以上是关于程序化机器人检测的主要内容,如果未能解决你的问题,请参考以下文章