网站可以检测到 Firefox 正在 Marionette 上运行吗?

问题描述 投票:0回答:1

在 Selenium 上运行 Firefox 需要 Geckodriver,因为 Gecko 引擎与 JSON Wire Protocol 并不真正兼容。因此,Geckodriver 通过使用 Marionette 进行翻译来提供 Selenium 和浏览器之间的所有命令,从而运行 HTTP 服务器。 网站真的可以判断当前浏览器是由 Marionette 控制的吗?我发现当 Firefox 自动化时,您可以通过使用 localhost 和配置中的 Marionette 端口来访问“Marionette 页面”。 Firefox 还显示了机器人,告诉用户当前的浏览器是自动化的。所以内置了某种自动化检测,但是可以访问它吗?

编辑:是的,确实不同的浏览器会暴露不同的东西,但是 javascript 检测不再起作用。它能够检测 Selenium RC,因为要工作它必须将一些 Javascript 代码注入浏览器。从 Selenium 2.0 开始,Webdriver 直接与浏览器通信,因此简单的 Javascript-Variable-Detection 不起作用。我还发现并解释了其中一些暴露的内容,但是网站实际上可以以某种方式访问它们吗?暴露的另一个区别是:Chrome 将 navigator.webdriver 属性设置为 true,但 Firefox 不会。

javascript selenium firefox geckodriver firefox-marionette
1个回答
0
投票

当您使用

firefox
选项或
--marionette
环境变量启动现代
MOZ_MARIONETTE=1
时,您将为 Firefox 启用 Marionette 控制。您只需打开最新 Firefox 版本的源代码即可了解其工作原理:

moz.configure

set_define("ENABLE_WEBDRIVER", webdriver)

nsCertOverrideService.cpp 和类似的核心文件:

#ifdef ENABLE_WEBDRIVER
#  include "nsIMarionette.h"
#endif

#ifdef ENABLE_WEBDRIVER
nsCOMPtr<nsIMarionette> marionette = do_GetService(NS_MARIONETTE_CONTRACTID);
if (marionette) {
  bool marionetteRunning = false;
  marionette->GetRunning(&marionetteRunning);
  if (marionetteRunning) {
    return true;
  }
}

nsCOMPtr<nsIRemoteAgent> agent = do_GetService(NS_REMOTEAGENT_CONTRACTID);
if (agent) {
  bool remoteAgentRunning = false;
  agent->GetRunning(&remoteAgentRunning);
  if (remoteAgentRunning) {
    return true;
  }
}
#endif

同时remote/components/moz.build:

XPIDL_SOURCES += [
    "nsIMarionette.idl",
    "nsIRemoteAgent.idl",
]

远程/组件/RemoteAgent.sys.mjs

const port = cmdLine.handleFlagWithParam("remote-debugging-port", false);
if (port !== null) {
  enabled = true;

远程/组件/Marionette.sys.mjs

// Complements -marionette flag for starting the Marionette server.
// We also set this if Marionette is running in order to start the server
// again after a Firefox restart.
const ENV_ENABLED = "MOZ_MARIONETTE";

this.enabled = Services.env.exists(ENV_ENABLED);

这意味着

--enable-webdriver
是配置选项,
--marionette
--remote-debugging-port
是运行时选项。有可能以某种方式检测到木偶吗?你可以更深入地验证一下,这是不可能的。

但是,我不明白你为什么要这样检测木偶。如果客户来了,付给我一分钱,然后说:“请从我的 Firefox 版本中清除任何可能的检测机制。”我会立即做。例如,Marionette 和远程调试代理可能只是工作而不暴露任何有关其状态的信息。这尤其意味着 Marionette 本地页面和浏览器搜索栏中有趣的机器人图标将消失。

它能够检测 Selenium RC,因为要工作它必须注入一些 Javascript 代码进入浏览器

我知道你正在谈论的 Selenium 中的多行代码。

请停止尝试使用客户端应用程序检查来检测机器人;这种方法并不可靠。您也许能够检测到一些愚蠢的情况,但您将绕过任何严重的机器人。当你与另一个开发者直接争斗时,你可能会遇到这样的情况。你永远都会输,因为另一个开发者可以自己修改应用程序,而你无法阻止这种修改。

© www.soinside.com 2019 - 2024. All rights reserved.