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

366

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

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

В теории 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.

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

РЕДАКТИРОВАТЬ ОБНОВЛЕНИЕ:

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

РЕДАКТИРОВАТЬ:

Когда я использую Fiddler для просмотра HTTP-запросов, отправляемых взад и вперед, я заметил, что запросы «поддельного браузера» часто имеют «no-cache» в заголовке ответа.

РЕДАКТИРОВАТЬ:

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

РЕДАКТИРОВАТЬ:

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

РЕДАКТИРОВАТЬ:

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

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

Его идентично по селену и хрому

РЕДАКТИРОВАТЬ:

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

Райан Вайнштейн
источник
4
@RyanWeinstein: это не трафик. Я предполагаю, что Selenium должен предоставить некоторые хуки JavaScript, которые можно обнаружить в клиентском JavaScript.
Микко Охтамаа
5
Или, если это трафик, то это шаблон трафика .... вы слишком быстро просматриваете страницы.
Микко Охтамаа
6
Я не просматриваю слишком быстро. Я загружаю только одну страницу, и я обычно перемещаюсь по ней с помощью мыши и клавиатуры. Также не имеет смысла, что Selenium нужно выставлять хуки, потому что это буквально запущенный chrome.exe. Он просто запускает обычный Chrome и позволяет получать данные из него. Есть еще идеи? Я думал, может быть, это как-то связано с печеньем. Это сводит меня с ума.
Райан Вайнштейн
5
Этот сайт использует distillтехнологию обнаружения бота и доставляет контент с помощью akamaitechnologies.comCDN от diffrent изобр например 95.100.59.245, 104.70.243.66,23.202.161.241
SIslam
5
Я испытываю ту же проблему с Selenium и драйвером Firefox. Интересно отметить, что я запускаю Selenium на виртуальной машине VMWare Workstation, которая выходит в Интернет через NAT. Хост-машина может получить доступ к stubhub, а виртуальная машина не может получить доступ при использовании Selenium или даже запущенного экземпляра браузера Selenium. У меня был заблокирован экземпляр VM Browser, и stubhub по-прежнему распознает компьютер и заблокировал его. Таким образом, он должен выполнять отпечатки пальцев браузера и компьютера каким-либо образом.
Брайан Кейн

Ответы:

55

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

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

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


Использование 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двоичного файла убедитесь, что имя измененного chromedriverдвоичного файла равно chromedriver, и что исходный двоичный файл либо перемещен из исходного местоположения, либо переименован.


Мой опыт с этим методом

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

colossatr0n
источник
@LekaBaper Спасибо за внимание. Я использовал версию chromedriver версии 2.41.578706.
colossatr0n
2
Не работал, даже когда я использовал эту модификацию chromedriver.exe на новом физическом компьютере в другой сети.
Ахмед Мемон
это дает ошибку говорит, эта версия не может работать на этом компьютере :(
Валид Буссета
@ colossatr0n Есть ли какой-нибудь необнаружимый форк с открытым исходным кодом, о котором вы знаете?
ishandutta2007
3
Обратите внимание, что люди с chromedriver объявили, что эта проблема не будет исправлена, поэтому вы можете ожидать, что придется использовать форк или редактировать двоичный файл на неопределенное время. bugs.chromium.org/p/chromedriver/issues/detail?id=3220
Кодиолог
144

По сути, способ обнаружения селена заключается в том, что они проверяют заранее определенные переменные javascript, которые появляются при работе с селеном. Сценарии обнаружения ботов обычно смотрят что-либо, содержащее слово «selenium» / «webdriver» в любой из переменных (в объекте окна), а также документируют переменные с именем $cdc_and $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 в шестнадцатеричном редакторе и просто выполнить замену вручную, фактически не выполняя никакой компиляции.

Эрти-Крис Элмаа
источник
26
да, это работало без проб, обратите внимание на одну проблему: если вы попали в «черный список» ДО этого изменения, довольно сложно выбраться. если вы хотите выйти из существующего черного списка, вам нужно реализовать фальшивые отпечатки холста, отключить флэш-память, изменить IP-адрес и изменить порядок заголовков запросов (язык подкачки и заголовки Accept). Как только вы попали в черный список, у них есть очень хорошие меры, чтобы отслеживать вас, даже если вы меняете IP, даже если вы открываете Chrome в режиме инкогнито и т. Д.
Erti-Chris Eelmaa
2
Я нашел файл "/ Users / your_username / chromium / src / chrome / test / chromedriver / js"
JonghoKim
7
Я просто заменить $cdcс xxxxв chromedriver.exeв шестнадцатеричном редакторе , и это сработало! Я также заметил, что если вы максимизируете окно браузера (а не используете предопределенный размер), оно обнаруживается реже.
szx
2
это было на Windows, OSX или Linux? Шестнадцатеричное редактирование на osx, похоже, не работает.
Ниш
5
с шестнадцатеричным редактированием с $ zzz_zzzzzzzzzzzzzzzzzzzzzz_ (такое же количество символов), но не сработало.
Аймон Фурнье
100

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

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

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

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

Решил выложить это как ответ, так как четко

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

Да.


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

alecxe
источник
@RyanWeinstein хорошо, у нас нет фактических доказательств, и мы можем только строить догадки и тестировать. На данный момент, я бы сказал, у них есть способ обнаружить нас, используя селен. Попробуйте поэкспериментировать с версиями селена - это может дать вам некоторые подсказки.
Алексе
1
Может ли это быть связано с тем, как определяются эфемерные порты? Метод остается в стороне от известных диапазонов. github.com/SeleniumHQ/selenium/blob/…
Эллиот де Лоне
9
Easyjet использует сервис Dylnetwork, да, он может блокировать фиктивных ботов, но не сложных, потому что мы тестировали его с более чем 2000 запросов в день с разных IP-адресов (которые мы снова используем «один и тот же» адрес), поэтому в основном каждый IP-адрес идет на 5-10 запросов в день, и из этого я могу сказать, что все эти службы обнаружения ботов предназначены для разработки и продажи около 45% работающих алгоритмов, использованный нами скребок был легко обнаружить, я могу заблокировать его, в то время как destilnetworks, squareshield и другие не может, что подтолкнуло меня никогда не использовать ни один из них.
Джеффри ТаГинтоки
3
Я думаю, что они обнаруживают navigator.webdriver в chrome webdriver. Я попытался сделать navigator.webdriver = false с помощью intoli.com/blog/not-possible-to-block-chrome-headless и stackoverflow.com/questions/47297877/… . Он возвращает страницу обнаружения ботов вместо дистилляции net.etworks.com/distil_identify_cookie.html
hoozecn
24

Пример того, как это реализовано на 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 !+""
aianitro
источник
13
почему последняя попытка не закрыта? кроме того, вы можете немного объяснить свой ответ.
ishandutta2007
16

Обфусцирующий результат JavaScripts

Я проверил исходный код chromedriver. Это добавляет некоторые файлы JavaScript в браузер.
Каждый файл JavaScript по этой ссылке добавляется на веб-страницы: https://chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/js/

Поэтому я использовал реверс-инжиниринг и запутал js-файлы с помощью Hex-редактирования. Теперь я был уверен, что никакие переменные javascript, имена функций и фиксированные строки не использовались для выявления активности селена. Но все же некоторые сайты и reCaptcha обнаруживают селен!
Возможно они проверяют модификации, которые вызваны выполнением chromedriver js :)


Изменить 1:

Chrome 'навигатор' модификация параметров

Я обнаружил, что в «навигаторе» есть некоторые параметры, которые кратко раскрывают использование chromedriver. Это параметры:

  • "navigator.webdriver" В неавтоматизированном режиме это значение не определено. В автоматическом режиме это «правда».
  • "navigator.plugins" На безголовом хроме имеет длину 0. Поэтому я добавил несколько поддельных элементов, чтобы обмануть процесс проверки длины плагина.
  • " navigator.languages" был установлен в значение chrome по умолчанию '["en-US", "en", "es"]'.

Так что мне нужно было расширение Chrome для запуска JavaScript на веб-страницах. Я сделал расширение с помощью кода js, представленного в статье, и использовал другую статью, чтобы добавить расширение zip в свой проект. Я успешно изменил значения; Но все равно ничего не изменилось!

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

Теперь я не уверен, стоит ли тратить больше времени на этот процесс автоматизации или поиск альтернативных методов!

ShayanKM
источник
12

Попробуйте использовать селен с определенным профилем пользователя 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 здесь

Коби К
источник
11

partial interface Navigator { readonly attribute boolean webdriver; };

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

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

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

Брайс
источник
4
«Трудно сказать без исходного кода» .. ну, исходный код находится в свободном доступе
Кори Голдберг
6
Я имел в виду без исходного сайта в вопросе исходного кода. Трудно сказать, что они проверяют.
Брайс
8

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

Тест для этого находится в коде селена в файле fingerprint_test.js, где в конце комментария написано «В настоящее время реализовано только в Firefox», но я не смог идентифицировать какой-либо код в этом направлении с помощью каких-то простых grepопераций, ни в текущее (41.0.2) дерево релизов Firefox, ни в дереве Chromium.

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

deamentiaemundi
источник
2
Я только что протестировал веб-драйвер с Firefox 55 и могу подтвердить, что это не так. Переменная window.navigator.webdriverне определена.
скоростной самолет
1
Обновление: я тестировал с Firefox 65, и это правда:window.navigator.webdriver == true
Speedplane
Firefox версии 76 все еще показывает, что это правда
user2284144
8

В дополнение к великолепному ответу @ Erti-Chris Eelmaa - это раздражает window.navigator.webdriverи доступно только для чтения. Событие, если вы измените его значение, falseвсе равно будет иметь место true. Вот почему браузер, управляемый автоматизированным программным обеспечением, все еще может быть обнаружен. MDN

Переменная управляется флагом --enable-automationв Chrome. Хромедрайвер запускает Chrome с этим флагом, и Chrome устанавливает значение window.navigator.webdriverв true. Вы можете найти это здесь . Вы должны добавить флаг «исключить переключатели». Например (Голанг):

package main

import (
    "github.com/tebeka/selenium"
    "github.com/tebeka/selenium/chrome"
)

func main() {

caps := selenium.Capabilities{
    "browserName": "chrome",
}

chromeCaps := chrome.Capabilities{
    Path:            "/path/to/chrome-binary",
    ExcludeSwitches: []string{"enable-automation"},
}
caps.AddChrome(chromeCaps)

wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", 4444))
}
ФДГ
источник
6

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

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

Бассель Самман
источник
Я думаю, что вы на правильном пути. Я протестировал с моей установкой и заменил пользовательский агент на действительную строку пользовательского агента, которая успешно прошла и получила тот же результат, stubhub заблокировал запрос.
Брайан Кейн
1
Эта тема очень обширна, я бы сказал, если вы ее не понимаете и хотите понять, здесь не то место. Начните с owasp. Посмотрите на тестирование на проникновение и веб-безопасность. Также, как я уже говорил, изучите modsecurity и WAF специально для этой темы.
Бассель Самман
1
Если бы это была проблема с заголовком HTTP, не заблокировался бы нормальный браузер? Заголовки HTTP точно такие же. И что именно я смотрю с этой ссылкой GitHub? Вы пытались использовать селен, чтобы пойти на тупик? Что-то очень, очень выключено.
Райан Вайнштейн
1
Я прошу прощения за путаницу. Я посмотрю на это, и тебе больше не нужно мне помогать, если ты не хочешь. Большая часть моего опыта связана с программированием системных приложений, поэтому я не был знаком с этими правилами безопасности, о которых вы говорите. Я посмотрю и попробую самообразоваться. Я ничего не пытаюсь обойти, мне просто было интересно узнать, как эти сайты обнаруживают пользователя, использующего селен.
Райан Вайнштейн
1
Я тоже разработчик :). Обучение - это причина, по которой я могу отстать. Я не против помочь, я просто хотел прояснить, что я не знаю ваших намерений и не могу точно помочь вам обойти безопасность их сайта. Чтобы ответить на ваш вопрос, хотя, это не селен, который они обнаруживают. Правила выявили подозрительное поведение и решили принять соответствующие меры против обидчика. Они ловят вас тем, что вы делаете не больше, чем тем, что вы делаете. В ссылке на репо вы можете оформить этот файл, чтобы получить представление о base_rules / modsecurity_crs_20_protocol_violations.conf
Самман,
6

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

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

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

lfaraone
источник
3
Я уже использовал этот сайт, и отпечаток пальца идентичен моему обычному браузеру. Также я ничего не автоматизирую. Я просто просматриваю как обычно.
Райан Вайнштейн
6

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

ЭКСПЕРИМЕНТ 1:

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

ЭКСПЕРИМЕНТ 2:

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

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

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

ПОСЛЕДСТВИЯ:

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

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

M3RS
источник
3
Я считаю, что Selenium вводит что-то на страницу через javascript, чтобы найти и получить доступ к элементам. Эта инъекция - это то, что я считаю, что они обнаруживают.
Zeusalmighty
Вы правы, этот тест на 100% действителен. Я сделал аналогичный тест с такими же результатами. Я мог бы отправить вкладку Enter или отправить ключи. В тот момент, когда я обращаюсь к элементам, страница перестает работать. Так что, если драйвер внедряет некоторый JavaScript в браузер. Мы могли бы просто зашифровать этот javascript, используя расширение chrome, и расшифровать на следующей странице, используя то же расширение. Я постараюсь посмотреть на это в следующие дни.
Триксо
6

Еще одна вещь, которую я обнаружил, заключается в том, что некоторые веб-сайты используют платформу, которая проверяет пользовательский агент. Если значение содержит: «HeadlessChrome», поведение может быть странным при использовании режима без головы.

Обходной путь для этого будет переопределить значение пользовательского агента, например в Java:

chromeOptions.addArguments("--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36");
Ади Оана
источник
5

Некоторые сайты обнаруживают это:

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) {}
Нестора
источник
Это не работает для Chrome и Firefox, селен 3.5.0, ChromeDriver 2.31.488774, geckodriver 0.18.0
jerrypy
4

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

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

PC3TJ
источник
4
Атрибут добавляется только в Firefox.
Луи
1
И это можно удалить из расширения селена, который контролирует браузер. Это будет работать в любом случае.
m3nda
3

Я нашел изменение javascript-переменной «key» следующим образом:

//Fools the website into believing a human is navigating it
        ((JavascriptExecutor)driver).executeScript("window.key = \"blahblah\";");

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

Juliagu
источник
2

Мне кажется, самый простой способ сделать это с Selenium - перехватить XHR, который возвращает отпечаток браузера.

Но поскольку это проблема только для Selenium, лучше просто использовать что-то еще. Предполагается, что селен делает такие вещи легче, а не намного сложнее.

pguardiario
источник
Какие есть другие варианты селена?
Тай
Я думаю, что Запросы будут основным вариантом Python. Если вы отправляете те же самые запросы, которые отправляет ваш браузер, вы будете выглядеть как обычный браузер.
pguardiario
2

Вы можете попробовать использовать параметр «enable-автоматизации»

var options = new ChromeOptions();

// hide selenium
options.AddExcludedArguments(new List<string>() { "enable-automation" });

var driver = new ChromeDriver(ChromeDriverService.CreateDefaultService(), options);

Но я хочу предупредить, что эта возможность была исправлена ​​в ChromeDriver 79.0.3945.16 . Поэтому, вероятно, вам следует использовать более старые версии Chrome.

Также, в качестве другого варианта, вы можете попробовать использовать InternetExplorerDriver вместо Chrome. Как по мне, IE вообще не блокирует без всяких взломов.

А для получения дополнительной информации попробуйте посмотреть здесь:

Selenium webdriver: изменение флага navigator.webdriver для предотвращения обнаружения селена

Не удается скрыть информационную панель Chrome, управляемую автоматизированным программным обеспечением, в Chrome v76

Сергей Матвиенко
источник