others - javascript - selenium 与chromedriver一起使用时可以检测网站?

时间:

基本上,检测selenium的方式是selenium的预定义javascript变量。bot检测脚本通常会在变量中(在window对象上)以及document对象中$cdc_和$wdc_中包含单词"selenium"/"webdriver"。

对我而言,我使用了chrome,所以,我要做的就是确保$cdc_作为文档变量不再存在,然后瞧瞧(下载chromedriver源代码,修改chromedriver并以不同的名称重新编译$cdc_ )

这是我在chromedriver中修改的函数:

call_function . js:


function getPageCache(opt_doc) {


 var doc = opt_doc || document;


 //var key = '$cdc_asdjflasutopfhvcZLmcfl_';


 var key = 'randomblabla_';


 if (!(key in doc))


 doc[key] = new Cache();


 return doc[key];


}



(注释,我只把$cdc_变成randomblabla_ 。

下面是一个伪代码,演示了bot可以使用的一些技术:


runBotDetection = function () {


 var documentDetectionKeys = [


"__webdriver_evaluate",


"__selenium_evaluate",


"__webdriver_script_function",


"__webdriver_script_func",


"__webdriver_script_fn",


"__fxdriver_evaluate",


"__driver_unwrapped",


"__webdriver_unwrapped",


"__driver_evaluate",


"__selenium_unwrapped",


"__fxdriver_unwrapped",


 ];



 var windowDetectionKeys = [


"_phantom",


"__nightmare",


"_selenium",


"callPhantom",


"callSelenium",


"_Selenium_IDE_Recorder",


 ];



 for (const windowDetectionKey in windowDetectionKeys) {


 const windowDetectionKeyValue = windowDetectionKeys[windowDetectionKey];


 if (window[windowDetectionKeyValue]) {


 return true;


 }


 };


 for (const documentDetectionKey in documentDetectionKeys) {


 const documentDetectionKeyValue = documentDetectionKeys[documentDetectionKey];


 if (window['document'][documentDetectionKeyValue]) {


 return true;


 }


 };



 for (const documentKey in window['document']) {


 if (documentKey.match(/$[a-z]dc_/) && window['document'][documentKey]['cache_']) {


 return true;


 }


 }



 if (window['external'] && window['external'].toString() && (window['external'].toString()['indexOf']('Sequentum') != -1)) return true;



 if (window['document']['documentElement']['getAttribute']('selenium')) return true;


 if (window['document']['documentElement']['getAttribute']('webdriver')) return true;


 if (window['document']['documentElement']['getAttribute']('driver')) return true;



 return false;


};



也可以在十六进制编辑器中简单地打开chromedriver.exe修改,而不需要手动进行替换。

正如我们已经在问题中发现的和发布的答案,有一个抗网络擦除和一个称为 "蒸馏网络"in的检测服务。 而且,根据公司首席执行官的采访结果:

他们还可以创建新的机器人,我们找出一种方法来识别他们正在使用的工具,所以不管他们迭代了多少次,我们都在阻止 selenium 。 我们现在用 python 和很多不同的技术来做。 一旦我们看到一个 Pattern 来自一种类型的,那么我们就可以反向工程化它们使用的技术。

要了解他们如何检测 selenium,需要花费时间和额外的挑战,但目前我们可以说:

  • 它与你使用 selenium的操作无关- 一旦你导航到该站点,就会立即检测到并禁用它。 我试图在操作之间添加人工随机延迟,在加载页面之后暂停一下,没有什么帮助。
  • 它不是关于浏览器指纹- 在多个浏览器中试图使用干净的配置文件,而不是隐藏模式。
  • 由于访谈中的提示,这是"逆向工程",我怀疑这是通过浏览器执行的一些JS代码,显示这是通过 selenium web浏览器实现的浏览器自动。

决定将它的作为答案发布,原因很清楚:

当你使用 selenium 和chromedriver时,网站是否可以检测到?

另外,我还没有尝试过旧的selenium 和旧的浏览器版本- 在理论上,可以在某一点上实现/添加到 selenium,这是当前的Distil检测器所依赖的。 如果是这样,我们可以检测到( 是的我们来检测探测器)的相关更改,查看更改和变更集,以及它们在何处检测。 这只是一个需要测试的理论。

在wellsfargo.com:上实现的例子


try {


 if (window.document.documentElement.getAttribute("webdriver")) return !+[]


} catch (IDLMrxxel) {}


try {


 if ("_Selenium_IDE_Recorder" in window) return !+""


} catch (KknKsUayS) {}


try {


 if ("__webdriver_script_fn" in document) return !+""



例如:


username = os.getenv("USERNAME")


userProfile ="C:Users" + username +"AppDataLocalGoogleChromeUser DataDefault"


options = webdriver.ChromeOptions()


options.add_argument("user-data-dir={}".format(userProfile))


# add here any tag you want.


options.add_experimental_option("excludeSwitches", ["ignore-certificate-errors","safebrowsing-disable-download-protection","safebrowsing-disable-auto-update","disable-client-side-phishing-detection"])


chromedriver ="C:Python27chromedriverchromedriver.exe"


os.environ["webdriver.chrome.driver"] = chromedriver


browser = webdriver.Chrome(executable_path=chromedriver, chrome_options=options)



Chrome标记列表这里

partial interface Navigator { readonly attribute boolean webdriver; };

Navigator界面的webdriver IDL属性必须返回webdriver-active标志的值,该标志最初为false。

Firefox被要求设置window.navigator.webdriver === true

javascript/firefox-driver/extension/content/server.js

用下面的代码编写html页。在DOM selenium中,你将看到outerHTML中的web driver属性,


<html>


<head>


 <script type="text/javascript">


 <!--


 function showWindow(){


 javascript:(alert(document.documentElement.outerHTML));


 }


 //-->


 </script>


</head>


<body>


 <form>


 <input type="button" value="Show outerHTML" onclick="showWindow()">


 </form>


</body>


</html>

某些站点这么检测:


function d() {


try {


 if (window.document.$cdc_asdjflasutopfhvcZLmcfl_.cache_)


 return !0


} catch (e) {}



try {


 //if (window.document.documentElement.getAttribute(decodeURIComponent("%77%65%62%64%72%69%76%65%72")))


 if (window.document.documentElement.getAttribute("webdriver"))


 return !0


} catch (e) {}



try {


 //if (decodeURIComponent("%5F%53%65%6C%65%6E%69%75%6D%5F%49%44%45%5F%52%65%63%6F%72%64%65%72") in window)


 if ("_Selenium_IDE_Recorder" in window)


 return !0


} catch (e) {}



try {


 //if (decodeURIComponent("%5F%5F%77%65%62%64%72%69%76%65%72%5F%73%63%72%69%70%74%5F%66%6E") in document)


 if ("__webdriver_script_fn" in document)


 return !0


} catch (e) {}



...