Может ли веб-сайт обнаружить, когда вы используете селен с chromedriver?


Я тестировал селен с Chromedriver, и я заметил, что некоторые страницы могут обнаружить, что вы используете селен, хотя нет никакой автоматизации вообще. Даже когда я просто просматриваю вручную, просто используя chrome через Selenium и Xephyr, я часто получаю страницу, в которой говорится, что обнаружена подозрительная активность. Я проверил свой пользовательский агент и отпечаток пальца моего браузера, и все они точно идентичны обычному браузеру chrome.

когда я просматриваю эти сайты в обычном режиме chrome все работает нормально, но в тот момент, когда я использую селен, я обнаружен.

теоретически chromedriver и chrome должны выглядеть буквально одинаково для любого веб-сервера, но каким-то образом они могут его обнаружить.

Если вы хотите какой-то тестовый код попробовать это:

from pyvirtualdisplay import Display
from selenium import webdriver

display = Display(visible=1, size=(1600, 902))
display.start()
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--disable-extensions')
chrome_options.add_argument('--profile-directory=Default')
chrome_options.add_argument("--incognito")
chrome_options.add_argument("--disable-plugins-discovery");
chrome_options.add_argument("--start-maximized")
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.delete_all_cookies()
driver.set_window_size(800,800)
driver.set_window_position(0,0)
print 'arguments done'
driver.get('http://stubhub.com')

Если вы просматриваете stubhub, вы будете перенаправлены и "заблокированы" в течение одного или двух запросов. Я исследовал это, и я не могу понять, как они могут сказать, что пользователь использует селен.

как они это делают?

ИЗМЕНЕНИЯ:

Я установил плагин Selenium IDE в Firefox, и я получил запрет, когда я пошел stubhub.com в обычном браузере firefox только с дополнительным плагином.

EDIT:

когда я использую Fiddler для просмотра HTTP-запросов, отправляемых туда и обратно, я заметил, что запросы "поддельного браузера" часто имеют "без кэша" в заголовке ответа.

EDIT:

результаты, как это есть способ обнаружить, что я нахожусь на странице Selenium Webdriver из Javascript, предполагая, что не должно быть никакого способа обнаружить, когда вы используете webdriver. Но факты говорят об обратном.

EDIT:

сайт загружает отпечаток пальца на свои серверы, но я проверил, и отпечаток Селена идентичен отпечатку пальца при использовании chrome.

EDIT:

Это одна из полезных нагрузок отпечатков пальцев, которые они отправляют своим серверы

{"appName":"Netscape","platform":"Linuxx86_64","cookies":1,"syslang":"en-US","userlang":"en-US","cpu":"","productSub":"20030107","setTimeout":1,"setInterval":1,"plugins":{"0":"ChromePDFViewer","1":"ShockwaveFlash","2":"WidevineContentDecryptionModule","3":"NativeClient","4":"ChromePDFViewer"},"mimeTypes":{"0":"application/pdf","1":"ShockwaveFlashapplication/x-shockwave-flash","2":"FutureSplashPlayerapplication/futuresplash","3":"WidevineContentDecryptionModuleapplication/x-ppapi-widevine-cdm","4":"NativeClientExecutableapplication/x-nacl","5":"PortableNativeClientExecutableapplication/x-pnacl","6":"PortableDocumentFormatapplication/x-google-chrome-pdf"},"screen":{"width":1600,"height":900,"colorDepth":24},"fonts":{"0":"monospace","1":"DejaVuSerif","2":"Georgia","3":"DejaVuSans","4":"TrebuchetMS","5":"Verdana","6":"AndaleMono","7":"DejaVuSansMono","8":"LiberationMono","9":"NimbusMonoL","10":"CourierNew","11":"Courier"}}

его идентичны в селене и в хроме

EDIT:

VPN работают для одного использования, но обнаруживаются после загрузки первой страницы. Очевидно, что некоторые javascript запускается для обнаружения Селена.

12 179

12 ответов:

Для Пользователей Mac

замена cdc_ переменная с помощью Vim или Perl

можно использовать vim, или как @Vic Seedoubleyew указал в ответе @Erti-Chris Eelmaa,perl, заменить на cdc_ переменной (смотрите сообщение @Erti-Chris Eelmaa, чтобы узнать больше об этой переменной). Используя vim или perl предотвращает необходимость перекомпиляции исходного кода или использования шестнадцатеричного редактора. Убедиться сделать копию оригинала chromedriver перед попыткой изменить его.


С Помощью Vim

vim /path/to/chromedriver

после запуска строки выше, вы, вероятно, увидите кучу тарабарщины. Сделайте следующее:

  1. искать cdc_ введя /cdc_ и нажать return.
  2. включить редактирование нажатием a.
  3. удалить любое количество $cdc_lasutopfhvcZLmcfl и заменить то, что было удалено с равным количеством письмена. Если ты этого не сделаешь, chromedriver не удастся.
  4. после того как вы закончите редактирование, нажмите клавишу esc.
  5. сохранить изменения и выйти, типа :wq! и нажать return.
  6. если вы не хотите сохранять изменения, но хотите выйти, введите :q! и нажать return.
  7. ты молодец.

перейти к измененному chromedriver и дважды щелкните по нему. А terminal окно должно открыться. Если вы не видите killed на выходе, вы успешно переделал драйвер.


С Помощью Perl

строка ниже заменяет cdc_ С dog_:

perl -pi -e 's/cdc_/dog_/g' /path/to/chromedriver

убедитесь, что строка замены будет то же количество символов, что и строка поиска, в противном случае chromedriver не удастся.

На Perl Объяснение

s///g означает, что вы хотите найти строку и заменить ее глобально другой строка (заменяет все вхождения).

например, s/string/replacment/g

и

s/// обозначает поиск и замена строки.

cdc_ - это строка поиска.

dog_ - это строка замены.

g глобальный ключ, который заменяет все вхождения строки.

Как проверить, если Perl замена сработала

следующая строка будет печатать каждое вхождение строки поиска cdc_:

perl -ne 'while(/cdc_/g){print "$&\n";}' /path/to/chromedriver

если это ничего не возвращает, то cdc_ была заменена.

и наоборот, вы можете использовать это:

perl -ne 'while(/dog_/g){print "$&\n";}' /path/to/chromedriver

чтобы увидеть, если строка замены, dog_, сейчас на chromedriver бинарный. Если это так, то строка замены будет напечатана приставка.

перейти к измененному chromedriver и дважды щелкните по нему. А terminal окно должно открыться. Если вы не видите killed на выходе вы успешно изменили драйвер.


Подводя Итоги

после изменения chromedriver binary, убедитесь, что имя изменено chromedriver двоичный chromedriver, и что исходный двоичный файл либо перемещается из исходного местоположения, либо переименованный.


Мой Опыт Работы С Этим Методом

ранее я был обнаружен на веб-сайте при попытке войти в систему, но после замены cdc_ С помощью строки равного размера я смог войти в систему. Как и другие сказали, хотя, если вы уже были обнаружены, вы можете получить блокировку по множеству других причин, даже после использования этого метода. Поэтому вам, возможно, придется попробовать получить доступ к сайту, который обнаружил вас с помощью VPN, другая сеть, или что у вас есть.

в основном способ обнаружения Селена работает, заключается в том, что они проверяют заранее определенные переменные javascript, которые появляются при работе с селеном. Сценарии обнаружения ботов обычно выглядят так, что содержат слово "selenium" / "webdriver" в любой из переменных (на объекте window), а также переменные документа, называемые $cdc_ и $wdc_. Конечно, все это зависит от того, в каком браузере вы находитесь. Все разные браузеры выставляют разные вещи.

для меня я использовал 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_.

вот псевдо-код, который демонстрирует некоторые из методов что бот сети могут использовать:

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;
};

согласно пользователю @szx, также можно просто открыть chromedriver.exe в HEX-редактор, и просто сделать замену вручную, без каких-либо компиляции.

Как мы уже выяснили в вопросе и опубликованных ответах, есть анти-веб-скребок и служба обнаружения ботов под названием "Выделить Сети" в игре здесь. И, по словам генерального директора компании интервью:

даже если они могут создавать новых ботов,мы выяснили способ идентификации Селен инструмент, который они используют, поэтому мы блокируем селен нет неважно, сколько раз они повторяются на этом боте. Мы делаем что теперь с Python и множеством различных технологий. Как только мы видим закономерность выйдите от одного типа бота, тогда мы работаем для того чтобы перепроектировать технологию они используют и идентифицируют ее как вредоносную.

Это займет время и дополнительные проблемы, чтобы понять, как именно они обнаруживают селен, но что мы можем сказать наверняка на данный момент:

  • это не связано с действиями, которые вы предпринимаете с селеном - как только вы перейдете на сайт, вы получите сразу же обнаружен и запрещен. Я попытался добавить искусственные случайные задержки между действиями, сделать паузу после загрузки страницы-ничего не помогло
  • это не о отпечатках пальцев браузера либо-попробовал его в нескольких браузерах с чистыми профилями и не, режимы инкогнито-ничего не помогло
  • поскольку, согласно подсказке в интервью, это было "обратное проектирование", я подозреваю, что это делается с помощью некоторого кода JS, выполняемого в браузере, показывая, что это браузер автоматизирован с помощью selenium webdriver

решил опубликовать его в качестве ответа, так как ясно:

может ли веб-сайт обнаружить, когда вы используете селен с chromedriver?

да.


кроме того, то, что я не экспериментировал с более старыми версиями selenium и более старыми версиями браузера - теоретически, может быть что-то реализовано/добавлено к selenium в определенный момент, который в настоящее время использует детектор сетевых ботов. Затем, если это так, мы можем обнаружить (да, давайте обнаружим детектор) в какой момент/версии было сделано соответствующее изменение, посмотрите в журнал изменений и наборы изменений, и, возможно, это может дать нам больше информации о том, где искать и что они используют для обнаружения браузера с поддержкой webdriver. Это просто теория, которую нужно проверить.

пример того, как это реализовано 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 !+""

partial interface Navigator { readonly attribute boolean webdriver; };

атрибут IDL webdriver интерфейса навигатора должен возвращать значение флага webdriver-active, которое изначально равно false.

это свойство позволяет веб-сайтам определять, что агент пользователя находится под контролем WebDriver, и может использоваться для смягчения атак типа "отказ в обслуживании".

взяты непосредственно из 2017 W3C редакторский проект WebDriver. Это сильно предполагает, что в по крайней мере, будущие итерации драйверов selenium будут идентифицированы для предотвращения неправильного использования. В конечном счете, трудно сказать без исходного кода, что именно вызывает драйвер chrome в частности, чтобы быть обнаруженным.

попробуйте использовать selenium с определенным профилем пользователя chrome, таким образом, вы можете использовать его в качестве конкретного пользователя и определить любую вещь, которую вы хотите, при этом он будет работать как "реальный" пользователь, посмотрите на процесс chrome с помощью проводника процессов, и вы увидите разницу с тегами.

например:

username = os.getenv("USERNAME")
userProfile = "C:\Users\" + username + "\AppData\Local\Google\Chrome\User Data\Default"
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:\Python27\chromedriver\chromedriver.exe"
os.environ["webdriver.chrome.driver"] = chromedriver
browser = webdriver.Chrome(executable_path=chromedriver, chrome_options=options)

список тегов chrome здесь

даже если вы отправляете все правильные данные (например, Selenium не отображается как расширение, у вас есть разумное разрешение/битовая глубина и т. д.), Существует ряд сервисов и инструментов, которые профилируют поведение посетителей, чтобы определить, является ли актер пользователем или автоматизированной системой.

например, посещение сайта, а затем сразу же собирается выполнить некоторые действия, перемещая мышь непосредственно к соответствующей кнопке, менее чем за секунду, это то, что ни один пользователь не будет на самом деле делать.

Это также может быть полезно в качестве средства отладки для использования сайта, такого как https://panopticlick.eff.org/ чтобы проверить, насколько уникален ваш браузер; это также поможет вам проверить, есть ли какие-либо конкретные параметры, которые указывают, что вы работаете в Selenium.

похоже, что они находятся за брандмауэром веб-приложения. Взгляните на modsecurity и owasp, чтобы увидеть, как они работают. На самом деле, то, что вы спрашиваете, как сделать уклонение от обнаружения бота. Это не то, для чего нужен веб-драйвер selenium. Он предназначен для тестирования вашего веб-приложения, не поражая другие веб-приложения. Это возможно, но в основном вам нужно будет посмотреть, что WAF ищет в своем наборе правил и специально избегать его с селеном, если сможете. Даже тогда, это все еще может быть не так работа, потому что вы не знаете, что WAF они используют. Вы сделали правильный первый шаг, то есть подделка агента пользователя. Если это не сработало, то WAF находится на месте, и вам, вероятно, нужно стать более сложным.

изменить: Точка взята из другого ответа. Сначала убедитесь, что ваш пользовательский агент настроен правильно. Возможно, он попал на локальный веб-сервер или обнюхал трафик.

Firefox, как говорят, установить window.navigator.webdriver === true при работе с webdriver. Это было в соответствии с одной из старых спецификаций (например:archive.org) но я не мог найти его в новая за исключением некоторых очень расплывчатых формулировок в приложениях.

тест для него находится в коде селена в файле fingerprint_test.js где в комментарии в конце говорится: "в настоящее время реализовано только в firefox", но я не смог идентифицировать какой-либо код в этом направлении с некоторыми простыми greping, ни в текущем (41.0.2) Firefox release-tree, ни в Chromium-tree.

Я также нашел комментарий для более старой фиксации относительно отпечатков пальцев в драйвере firefox b82512999938 с января 2015 года. Этот код все еще находится в Selenium GIT-master, загруженном вчера в javascript/firefox-driver/extension/content/server.js с комментарием, ссылающимся на несколько иначе сформулированное приложение в текущей спецификации W3C webdriver.

обнаружение ботов, которое я видел, кажется более сложным или, по крайней мере, отличается от того, что я прочитал в ответах ниже.

эксперимент 1:

  1. Я открываю браузер и веб-страницу с селеном из консоли Python.
  2. мышь уже находится в определенном месте, где я знаю, что ссылка появится после загрузки страницы. Я никогда не двигайте мышь.
  3. Я нажимаю левую кнопку мыши один раз (это необходимо взять фокус с консоли, где работает Python, в браузер).
  4. я снова нажимаю левую кнопку мыши (помните, что курсор находится над данной ссылкой).
  5. ссылка открывается нормально, как и должно быть.

Эксперимент 2:

  1. Как и раньше, я открываю браузер и веб-страницу с Selenium из консоли Python.

  2. на этот раз вместо щелчка мышью я использую Selenium (в консоли Python), чтобы щелкнуть тот же элемент со случайным смещением.

  3. ссылка не открывается, но я перехожу на страницу регистрации.

последствия:

  • открытие веб-браузера через Selenium не мешает мне появляться человеком
  • перемещение мыши, как человек, не обязательно классифицироваться как человек
  • щелчок что-то через селен со смещением еще поднимает тревогу

кажется загадочным, но я думаю, что они могут просто определить, происходит ли действие от Селена или нет, в то время как им все равно, был ли сам браузер открыт через селен или нет. Или они могут определить, имеет ли окно фокус? Было бы интересно услышать, Есть ли у кого-нибудь идеи.

напишите html-страницу со следующим кодом. Вы увидите, что в DOM selenium применяется атрибут webdriver в outerHTML

<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) {}