代码之家  ›  专栏  ›  技术社区  ›  Matt

程序化机器人检测

  •  16
  • Matt  · 技术社区  · 16 年前

    我需要写一些代码来分析我们网站上的某个用户是否是机器人。如果是机器人,我们会采取一些具体行动。查看用户代理对于任何东西都不是成功的,但对于友好的bot来说是成功的,因为您可以在bot中指定所需的任何用户代理。我在找那些不友好的机器人。到目前为止,我有很多想法:

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

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

    9 回复  |  直到 12 年前
        1
  •  8
  •   erickson    16 年前

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

    也就是说,你是否必须排除每一个机器人,以牺牲对待真正的用户像机器人一样?或者,如果机器人爬行你的网站,只要他们没有影响性能,可以吗?

    排除所有机器人程序的唯一方法是关闭网站。恶意用户可以将其bot分发给足够多的计算机,使您无法将其流量与真实用户区分开来。javascript和css之类的技巧无法阻止确定的攻击者。

    如果一个“快乐的媒体”是令人满意的,一个可能有用的技巧是用css隐藏链接,这样用户在浏览器中看不到它们,但它们仍然在html中。任何跟踪这些“毒药”链接的代理都是机器人。

        2
  •  8
  •   Diodeus - James MacFarlane    16 年前

    用户代理可以被伪造。机长被破解了。有效的cookies可以通过页面请求发送回服务器。合法程序(如Adobe Acrobat Pro)可以在一个会话中进入并下载网站。用户可以禁用javascript。由于没有“正常”用户行为的标准度量,因此无法将其与bot区分开来。

    换言之:这离不开把用户拉到某种形式的互动聊天中,希望他们通过图灵测试,然后,他们也可以成为一个非常好的机器人。

        3
  •  3
  •   Finbarr    15 年前

    有个主意:

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

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

        4
  •  2
  •   Rob Prouse    16 年前

    你说有些用户看起来像机器人没关系,因此,

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

        5
  •  2
  •   Greg    16 年前

    一个简单的测试是javascript:

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

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

    url被分解以伪装它。

        6
  •  1
  •   krosenvold    16 年前

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

        7
  •  0
  •   Mat    16 年前

    好吧,这真的是为网站的一个特定页面。我们不希望一个机器人提交的表格B/C它混乱的跟踪。老实说,友好的机器人、谷歌、雅虎等都不是问题,因为他们通常不会先填写表格。如果我们怀疑有人是机器人,我们可能会给他们看一张验证码图片或类似的东西…如果他们通过了,他们就不是机器人了,表格会提交…

    我听说过把表单放在flash中,或者使用submit javascript,但我更希望不要阻止真正的用户使用这个网站,除非我怀疑他们是个机器人……

        8
  •  0
  •   Dirk Vollmar    16 年前

    我认为你检查会话id的想法已经非常有用了。

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

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

    但是,这样的检查可能不适合作为实时检查,因为您必须分析某种可能会耗费时间的服务器日志。

        9
  •  0
  •   Mat    16 年前

    嘿,谢谢你的回复。我认为一些建议的结合会起到很好的作用。主要是隐藏的表单元素乘以表单填写的速度,可能还有“毒药链接”的想法。我认为它将涵盖大部分的基础。当你谈论机器人的时候,你不会找到所有的机器人,所以没有必要认为你会…愚蠢的机器人。