Чи може веб-сайт виявити, коли ви використовуєте селен із хромедрівером?


364

Я тестував Selenium за допомогою Chromedriver і помітив, що на деяких сторінках можна виявити, що ви використовуєте Selenium, хоча автоматики взагалі немає. Навіть коли я переглядаю вручну, лише використовуючи хром через Селен і Ксефір, я часто отримую сторінку з повідомленням про виявлення підозрілої активності. Я перевірив свій користувальницький агент і відбиток свого браузера, і всі вони точно ідентичні звичайному браузеру 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')

Якщо переглядати заглуху, ви переймете та будете "заблоковані" протягом одного або двох запитів. Я досліджував це, і не можу зрозуміти, як вони можуть сказати, що користувач використовує Selenium.

Як вони це роблять?

РЕДАКТУВАТИ ОНОВЛЕННЯ:

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

Редагувати:

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

Редагувати:

Результати на кшталт цього Чи існує спосіб виявити, що я перебуваю на сторінці 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 працюють за одноразове використання, але виявляються після завантаження першої сторінки. Очевидно, що для виявлення Selenium запущено деякий JavaScript.


4
@RyanWeinstein: Це не трафік. Я здогадуюсь, що Selenium повинен виявити деякі гачки JavaScript, які можна виявити на JavaScript на стороні клієнта.
Мікко Охтамаа

5
Або якщо це рух, то це схема руху .... ви занадто швидко переглядаєте сторінки.
Мікко Охтама

6
Я не переглядаю занадто швидко. Я завантажую лише одну сторінку і переходжу по ній нормально за допомогою миші та клавіатури. Крім того, не має сенсу, що Селен повинен виставляти гачки, оскільки його буквально працює chrome.exe. Він просто працює у звичайному хромі та дозволяє отримувати дані з нього. Будь-які інші ідеї? Я думав, може, це має щось спільне з печивом. Це зводить мене з розуму.
Райан Вайнштейн

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, тоді як VM не може отримати доступ при використанні Selenium або навіть запущеному екземплярі браузера Selenium. У мене був заблокований екземпляр браузера VM, а stubhub все ще розпізнає машину та заблокував її. Отже, це повинно певним чином виконувати відбиток браузера та машини.
Брайан Каїн

Відповіді:


51

Для користувачів Mac

Заміна cdc_змінної за допомогою Vim або Perl

Ви можете використовувати vimабо як @Vic Seedoubleyew у відповіді @ Erti-Chris Eelmaa, perlщоб замінити cdc_змінну в chromedriver( Див. Пост від @ Erti-Chris Eelmaa, щоб дізнатися більше про цю змінну ). Використання vimабо perlне дозволяє вам перекомпілювати вихідний код або використовувати шестигранний редактор. Обов'язково зробіть копію оригіналу, 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, іншої мережі чи того, що у вас є.


@LekaBaper Дякую за голову вгору. Версія для хромадривера, яку я використав, була версія 2.41.578706.
colossatr0n

2
Не працювало навіть тоді, коли я використовував цю модифікацію chromedriver.exe на новому фізичному комп'ютері в іншій мережі.
Ахмед

це дає помилку говорить, що ця версія не може працювати на цьому комп’ютері :(
Walid Bousseta

@ colossatr0n Чи є невідомі вилки з відкритим кодом, про які вам відомо?
ishandutta2007

3
Зауважте, що люди з хромедрівером заявили, що цю проблему не виправлять, тому ви можете сподіватися, що вам доведеться використовувати виделку чи редагувати двійковий файл на невизначений час. bugs.chromium.org/p/chromedriver/isissue/detail?id=3220
Кодіолог

144

В основному так, як працює виявлення селену, є те, що вони перевіряють наперед визначені змінні JavaScript, які з'являються під час роботи з селеном. Сценарії виявлення ботів зазвичай шукають все, що містить слово "selenium" / "webdriver" в будь-якій із змінних (на об'єкті вікна), а також документують змінні, що називаються $cdc_та $wdc_. Звичайно, все це залежить від того, в якому браузері ви знаходитесь. Усі різні браузери відкривають різні речі.

Для мене я використав chrome, тому все, що мені довелося зробити, це переконатися, що $cdc_він більше не існував як змінна документа, а voila (завантажте вихідний код Chromeedriver, модифікуйте Chromeedriver і перекомпілюйте $cdc_під іншим ім’ям.)

це функція, яку я змінив у kromedriver:

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 та змінити порядок заголовка запиту (мова підкачки та прийняти заголовки). Щойно ви потрапили до чорного списку, вони мають дуже хороші заходи для відстеження вас, навіть якщо ви змінюєте IP, навіть якщо ви відкриєте хром у режимі інкогніто тощо
Erti-Chris Eelmaa

2
Я знайшов файл "/ Users / your_username / chromium / src / chrome / test / chromedriver / js"
JonghoKim

6
Я просто замінити $cdcз xxxxв chromedriver.exeв шістнадцятковому редакторі , і це спрацювало! Я також помітив, що якщо ви максимізуєте вікно браузера (а не використовуєте заздалегідь заданий розмір), воно виявляється рідше.
szx

2
це було на Windows, OSX чи Linux? Шістнадцяткове редагування на OSX, здається, не працює.
Ніш

5
шістнадцятковим редактором $ zzz_zzzzzzzzzzzzzzzzzzzz_ (однакова кількість символів), але не працює.
Еймон Фурньє

100

Як ми вже розібралися у запитанні та опублікованих відповідях, тут грає антисептична мережа та служба виявлення ботів під назвою "Distil Networks" . І відповідно до інтерв'ю генерального директора компанії :

Незважаючи на те, що вони можуть створювати нових ботів, ми вигадали спосіб ідентифікувати Selenium інструмент, який вони використовують, тому ми блокуємо Selenium незалежно від того, скільки разів вони повторюють цей бот . Ми робимо це зараз із Python та безліччю різних технологій. Як тільки ми бачимо, що з одного типу бота з'являється візерунок, ми працюємо над тим, щоб інженером змінити технологію, яку вони використовують, і визначити її як зловмисну.

Знадобиться час та додаткові виклики, щоб зрозуміти, як саме вони виявляють Селен, але що ми можемо сказати напевно:

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

Вирішили опублікувати це як відповідь, оскільки однозначно:

Чи може веб-сайт виявити, коли ви використовуєте селен із хромедрівером?

Так.


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


@RyanWeinstein добре, у нас немає фактичних доказів, і ми можемо лише спекулювати та перевіряти. На даний момент я б сказав, що у них є спосіб виявити нас за допомогою селену. Спробуйте експериментувати з селеновими версіями - це може дати вам декілька підказок.
alecxe

1
Чи це може мати відношення до того, як визначаються ефемерні порти? Метод тримається подалі від відомих діапазонів. github.com/SeleniumHQ/selenium/blob/…
Elliott de Launay

9
Easyjet використовує сервіс distilnetwork, так, він може блокувати фіктивні боти, але не складні, тому що ми перевірили його з більш ніж 2000 запитами на день з різних IP-адрес (які ми повторно використовуємо "однаковою" адресою), тому в основному кожен IP-код 5-10 запитів на день, і з цього я можу сказати, що всі ці служби виявлення ботів є саме там, щоб розробити і продати близько 45% робочих алгоритмів, скрепер, який ми використовували, було легко виявити, я можу його заблокувати під час destilnetworks, квадрата і інших не міг, що підштовхнуло мене ніколи не використовувати жодного з них.
Jeffery ThaGintoki

3
Я думаю, вони виявляють навігатор.webdriver у хромованому веб-драйві. Я спробував зробити navigator.webdriver = брехня за допомогою intoli.com/blog/not-possible-to-block-chrome-headless і stackoverflow.com/questions/47297877 / ... . Він повертає сторінку виявлення бота замість distilnetworks.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 !+""

13
чому остання спроба не закрита? до того ж ви можете трохи пояснити свою відповідь.
ishandutta2007

16

Обмежуючи результат JavaScripts

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

Тож я застосував зворотну інженерію і заплутав js-файли шляхом редагування Hex. Тепер я був впевнений, що більше ніяких змінних javascript, імен функцій та фіксованих рядків не використовувалося для виявлення активності селену. Але все ж деякі сайти та reCaptcha виявляють селен!
Можливо, вони перевіряють модифікації, які викликані виконанням хромедрівера js :)


Редагувати 1:

Змінення параметрів "навігатора" Chrome

Я виявив, що в "навігаторі" є деякі параметри, які коротко розкривають використання хромодрука. Це параметри:

  • "navigator.webdriver" У неавтоматизованому режимі це "невизначено". В автоматизованому режимі це "правда".
  • "navigator.plugins" Хром без голови має 0 довжину. Тому я додав кілька підроблених елементів, щоб обдурити процес перевірки довжини плагіна.
  • " navigator.languages" було встановлено за замовчуванням значення хрому '["en-US", "en", "es"]'.

Тож мені було потрібно хромоване розширення для запуску javascript на веб-сторінках. Я зробив розширення з кодом js, наданим у цій статті, і застосував іншу статтю, щоб додати розширення на блискавці до свого проекту. Я успішно змінив значення; Але все одно нічого не змінилося!

Я не знайшов інших подібних змінних, але це не означає, що вони не існують. Все-таки reCaptcha виявляє хромедрівер, тож слід змінити більше змінних. Наступний крок повинен бути зворотним інжинірингом послуг детекторних , що я не хочу робити.

Тепер я не впевнений, чи варто витрачати більше часу на цей процес автоматизації або шукати альтернативні методи!


12

Спробуйте використовувати селен із певним профілем користувача 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)

тут список хромових тегів


11

partial interface Navigator { readonly attribute boolean webdriver; };

Атрибут IDL webdriver інтерфейсу Navigator повинен повертати значення прапора, що активний webdriver, яке спочатку є помилковим.

Ця властивість дозволяє веб-сайтам визначати, що користувальницький агент знаходиться під контролем WebDriver, і його можна використовувати для зменшення атак відмови у наданні послуг.

Взято безпосередньо з проекту редактора WebDriver редактора W3C 2017 року . Це значною мірою означає, що принаймні майбутні ітерації драйверів селену будуть ідентифіковані для запобігання нецільовому використанню. Зрештою, без вихідного коду важко сказати, що саме спричиняє виявлення драйвера хрому.


4
"важко сказати без вихідного коду" .. ну вихідний код є у вільному доступі
Corey Goldberg

6
Я мав на увазі без вихідного коду веб-сайту. Важко сказати, проти чого вони перевіряють.
Брайс

8

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

Тест на нього знаходиться в коді селену у файлі fingerprint_test.js, де в кінці коментаря написано "В даний час реалізовано лише у firefox", але я не зміг ідентифікувати жоден код у цьому напрямку за допомогою простого grepING, ні в Поточний (41.0.2) дерево випуску Firefox, аніж дерево Хром.

З січня 2015 року я також знайшов коментар щодо старішої відповідальності щодо відбитків пальців у драйвера firefox b82512999938 . Цей код все ще знаходиться у завантаженому вчора в javascript/firefox-driver/extension/content/server.jsселені GIT-майстер із коментарем, що посилається на дещо інакше сформульований додаток у поточній специфікації веб-драйвера w3c.


2
Я щойно перевірив веб-драйвер з Firefox 55 і можу підтвердити, що це неправда. Змінна window.navigator.webdriverне визначена.
швидкісний літак

1
Оновлення: Я перевірив Firefox 65, і це правда:window.navigator.webdriver == true
швидкісний літак

Firefox версія 76 все ще показує, що це правда
користувач2284144

8

Крім чудової відповіді @ Erti-Chris Eelmaa - це дратує, window.navigator.webdriverі це лише для читання. Подія, якщо ви зміните значення на falseнього, все одно матиме true. Ось чому браузер, керований автоматизованим програмним забезпеченням, все ще можна виявити. MDN

Змінна управляється прапором --enable-automationу хромі. Запуски chromedriver хром з цим прапором і хром встановлює 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

Це здається, що вони стоять за брандмауером веб-додатків. Погляньте на модність та власність, щоб побачити, як вони працюють. Насправді, ви запитуєте, як зробити ухилення від виявлення бота. Це не те, для чого призначений веб-драйвер селену. Він призначений для тестування веб-програми, а не для потрапляння на інші веб-програми. Це можливо, але в основному вам доведеться подивитися на те, що WAF шукає у своєму наборі правил, і спеціально уникати цього з селеном, якщо можете. Навіть тоді це може все ще не працювати, оскільки ви не знаєте, який WAF вони використовують. Ви зробили правильний перший крок, тобто підробка агента користувача. Якщо це не спрацювало, значить, WAF є на місці, і вам, ймовірно, потрібно стати більш хитрими.

Правка: Точка, взята з іншої відповіді. Переконайтеся, що ваш агент користувача спочатку встановлений правильно. Можливо, він потрапив на локальний веб-сервер або нюхає трафік, що виходить.


Я думаю, ти на правильному шляху. Я перевірив налаштування і замінив Агент користувача на дійсну рядок агента користувача, який успішно пройшов і отримав той же результат, stubhub заблокував запит.
Брайан Каїн

1
Ця тема дуже обширна, я б сказав, якщо ви її не розумієте і хочете зрозуміти, тут не саме місце. Почніть з овасп. Погляньте на тестування на проникнення та безпеку веб. Крім того, як я вже говорив раніше, вивчіть питання безпеки та WAF саме для цієї теми.
Бассель Семман

1
Якби це була проблема заголовка HTTP, чи не заблокувався б звичайний браузер? Заголовки HTTP точно такі ж. Крім того, що саме я дивлюсь із цим посиланням на github? Ви намагалися використовувати селен, щоб перейти на заглушку? Щось дуже вимкнено.
Райан Вайнштейн

1
Вибачте за плутанину. Я розберуся в цьому, і вам більше не доведеться допомагати, якщо ви цього не хочете. Більшість мого досвіду стосується програм програмування систем, тому я не був знайомий з цими правилами безпеки, про які ви говорите. Я погляну і спробую виховувати себе. Я не намагаюся нічого обійти, мені було просто цікаво дізнатися, як ці веб-сайти виявляють користувача за допомогою селену.
Райан Вайнштейн

1
Я теж розробник :). Навчання - це причина, яку я можу відстати. Я не проти допомогти, я просто хотів уточнити, що не знаю ваших намірів і не можу точно допомогти вам обійти їх безпеку на веб-сайті. Щоб відповісти на ваше запитання, вони виявляють не селен. Правила виявили підозрілу поведінку і вирішили вжити відповідних заходів щодо клієнта, який порушує правопорушення. Вони ловлять тебе тим, що ти не робиш більше, ніж тим, що ти робиш. За посиланням repo, ви можете оформити цей файл, щоб отримати уявлення base_rules / modsecurity_crs_20_protocol_violations.conf
Самман

6

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

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

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


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

6

Виявлення бота, яке я бачив, здається більш складним або принаймні іншим, ніж те, що я читав у відповідях нижче.

ДОСВІД 1:

  1. Відкриваю браузер та веб-сторінку із Selenium із консолі Python.
  2. Миша вже знаходиться в певному місці, де я знаю, що посилання з’явиться після завантаження сторінки. Я ніколи не рухаю мишкою.
  3. Я натискаю ліву кнопку миші один раз (це потрібно, щоб зосередити увагу на консолі, де Python працює до браузера).
  4. Я знову натискаю ліву кнопку миші (пам'ятайте, курсор знаходиться над заданим посиланням).
  5. Посилання відкривається нормально, як слід.

ДОСВІД 2:

  1. Як і раніше, я відкриваю браузер та веб-сторінку із Selenium із консолі Python.

  2. Цього разу, замість клацання мишкою, я використовую Selenium (на консолі Python), щоб натиснути на той самий елемент із випадковим зміщенням.

  3. Посилання не відкривається, але я перейшов на сторінку реєстрації.

ВПЛИВИ:

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

Здається, загадково, але я думаю, що вони можуть просто визначити, походить дія від Selenium чи ні, при цьому їм не байдуже, чи відкривався сам браузер через Selenium чи ні. Або вони можуть визначити, чи вікно має фокус? Було б цікаво почути, якщо хтось має якусь інформацію.


3
Я вважаю, що Selenium вводить щось у сторінку через javascript для пошуку та доступу до елементів. Я вважаю, що ця ін'єкція виявляється.
zeusalmighty

Ви праві, цей тест 100% дійсний. Я робив подібний тест з такими ж результатами. Я можу надіслати вкладку Enter або надіслати ключі. У момент, коли я отримую доступ до елементів, сторінка перестала працювати. Тож якщо драйвер вводить у браузер якийсь JavaScript. Ми могли просто зашифрувати цей JavaScript за допомогою хромового розширення та розшифрувати на наступній сторінці за допомогою того ж розширення. Я спробую подивитися на це наступні дні.
trixo

6

Ще одне, що я виявив - це те, що на деяких веб-сайтах використовується платформа, яка перевіряє User Agent. Якщо значення містить: "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 у зовнішньомуHTML

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


4
Атрибут додається лише у Firefox.
Луї

1
І можна видалити його з розширення селену, яке контролює браузер. Це все одно запрацює.
м3нда

3

Я знайшов зміну змінної javascript "key" на зразок цієї:

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

працює на деяких веб-сайтах при використанні Selenium Webdriver разом з Google Chrome, оскільки багато сайтів перевіряють цю змінну, щоб уникнути їх скраплення Selenium.


2

Мені здається, найпростіший спосіб зробити це з Selenium - це перехоплення XHR, який надсилає назад відбиток браузера.

Але оскільки це лише проблема селену, краще просто використовувати щось інше. Селен повинен зробити такі речі легшими, а не складнішими.


Які ще варіанти для селену?
Тай

Я думаю, що Запити будуть основним варіантом пітона. Якщо ви надішлете ті самі запити, які надсилає ваш браузер, ви з'явитеся як звичайний браузер.
pguardiario

2

Ви можете спробувати скористатися параметром "enable-Automation"

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 . Тому, напевно, вам слід використовувати старіші версії хрому.

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

А для отримання додаткової інформації спробуйте подивитися тут:

Selenium webdriver: Змінення прапора navigator.webdriver для запобігання виявленню селену

Не вдається приховати "Chrome контролюється автоматизованим програмним забезпеченням" в Інфобарі в Chrome v76

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.