Czy strona internetowa może wykryć, kiedy używasz selenu z chromedriver?


364

Testowałem Selenium za pomocą Chromedrivera i zauważyłem, że niektóre strony mogą wykryć, że używasz Selenium, mimo że w ogóle nie ma automatyzacji. Nawet gdy przeglądam ręcznie, używając Chrome za pośrednictwem Selenium i Xephyr, często pojawia się strona z informacją o wykryciu podejrzanej aktywności. Sprawdziłem agenta użytkownika i odcisk palca przeglądarki i wszystkie są dokładnie identyczne jak normalna przeglądarka chrome.

Kiedy przeglądam te strony w normalnym chrome, wszystko działa dobrze, ale w momencie, gdy używam Selenium, jestem wykrywany.

Teoretycznie chromedriver i chrome powinny wyglądać dosłownie tak samo na każdym serwerze internetowym, ale w jakiś sposób mogą je wykryć.

Jeśli chcesz trochę kodu testowego, wypróbuj to:

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

Jeśli przeglądasz stubhub, zostaniesz przekierowany i „zablokowany” w ramach jednego lub dwóch żądań. Badałem to i nie mogę dowiedzieć się, w jaki sposób można stwierdzić, że użytkownik używa Selenium.

Jak oni to robią?

EDYCJA AKTUALIZACJI:

Zainstalowałem wtyczkę Selenium IDE w Firefoksie i zostałem zbanowany, gdy poszedłem na stubhub.com w normalnej przeglądarce Firefox z tylko dodatkową wtyczką.

EDYTOWAĆ:

Kiedy używam Fiddlera do przeglądania żądań HTTP przesyłanych tam iz powrotem, zauważyłem, że żądania „fałszywych przeglądarek” często zawierają „brak pamięci podręcznej” w nagłówku odpowiedzi.

EDYTOWAĆ:

wyniki takie jak to Czy istnieje sposób na wykrycie, że jestem na stronie Selenium Webdriver ze strony Javascript sugeruje, że nie powinno być sposobu na wykrycie, kiedy używasz webdriver. Ale te dowody sugerują inaczej.

EDYTOWAĆ:

Witryna przesyła odcisk palca na swoje serwery, ale sprawdziłem, a odcisk palca selenu jest identyczny jak odcisk palca przy użyciu chrome.

EDYTOWAĆ:

Jest to jeden z ładunków odcisków palców wysyłanych na ich serwery

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

Jest identyczny w selenie i chromie

EDYTOWAĆ:

Sieci VPN działają do jednorazowego użytku, ale są wykrywane po załadowaniu pierwszej strony. Najwyraźniej jakiś skrypt JavaScript jest uruchamiany w celu wykrycia Selenium.


4
@RyanWeinstein: To nie jest ruch. Domyślam się, że Selenium musi ujawnić pewne haczyki JavaScript, które można wykryć w JavaScript po stronie klienta.
Mikko Ohtamaa,

5
Lub jeśli jest to ruch, to jest to wzorzec ruchu ... zbyt szybko przeglądasz strony.
Mikko Ohtamaa,

6
Nie przeglądam zbyt szybko. Ładuję tylko jedną stronę i przeglądam ją normalnie za pomocą myszy i klawiatury. Również nie ma sensu, aby Selenium musiał ujawniać haki, ponieważ dosłownie działa chrome.exe. To po prostu działa normalnie chrome i pozwala na uzyskanie z niego danych. Jakieś inne pomysły? Myślałem, że może to ma coś wspólnego z ciasteczkami. Doprowadza mnie to do szału.
Ryan Weinstein

5
Ta strona używa distilltechnologii wykrywania botów i dostarcza zawartość za pomocą akamaitechnologies.comCDN od rozróżnianie ips np 95.100.59.245, 104.70.243.66,23.202.161.241
SIslam

5
Mam ten sam problem z Selenium i sterownikiem firefox. Interesującą rzeczą do odnotowania jest to, że korzystam z Selenium na maszynie wirtualnej VMWare Workstation, która uzyskuje dostęp do Internetu za pośrednictwem NAT. Komputer hosta może uzyskać dostęp do stubhub, podczas gdy maszyna wirtualna nie może uzyskać dostępu podczas korzystania z Selenium, ani nawet uruchomionej instancji przeglądarki Selenium. Miałem zablokowaną instancję VM Browser, a stubhub nadal rozpoznaje maszynę i blokuje ją. Musi więc w jakiś sposób wykonywać odcisk palca przeglądarki i komputera.
Brian Cain

Odpowiedzi:


51

Dla użytkowników komputerów Mac

Zastępowanie cdc_zmiennej za pomocą Vima lub Perla

Możesz użyć vimlub, jak wskazał @Vic Seedoubleyew w odpowiedzi @ Erti-Chris Eelmaa, perlzastąpić cdc_zmienną w chromedriver( Zobacz post @ Erti-Chris Eelmaa, aby dowiedzieć się więcej o tej zmiennej ). Użycie vimlub perlzapobiega konieczności ponownej kompilacji kodu źródłowego lub użycia edytora szesnastkowego. chromedriverPrzed przystąpieniem do edycji należy wykonać kopię oryginału . Testowano również poniższe metody chromedriver version 2.41.578706.


Korzystanie z Vima

vim /path/to/chromedriver

Po uruchomieniu powyższej linii prawdopodobnie zobaczysz kilka bełkotów. Wykonaj następujące czynności:

  1. Wyszukaj cdc_, wpisując /cdc_i naciskając return.
  2. Włącz edycję, naciskając a.
  3. Usuń dowolną ilość $cdc_lasutopfhvcZLmcfli zastąp to, co zostało usunięte, znakami o równej ilości. Jeśli tego nie zrobisz, chromedriverzawiedzie.
  4. Po zakończeniu edycji naciśnij esc.
  5. Aby zapisać zmiany i wyjść, wpisz :wq! i naciśnij return.
  6. Jeśli nie chcesz zapisać zmian, ale chcesz wyjść, wpisz :q! i naciśnij return.
  7. Jesteś skończony.

Przejdź do zmienionego chromedriveri kliknij go dwukrotnie. terminalOkno powinno otworzyć. Jeśli nie widać killedna wyjściu, pomyślnie zmodyfikowałeś sterownik.


Korzystanie z Perla

Linia poniżej replaces cdc_z dog_:

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

Upewnij się, że ciąg zastępujący ma taką samą liczbę znaków jak ciąg wyszukiwania, w przeciwnym razie chromedriver nie powiedzie się.

Wyjaśnienie Perla

s///g oznacza, że ​​chcesz wyszukać ciąg i zastąpić go globalnie innym ciągiem (zastępuje wszystkie wystąpienia).

na przykład, s/string/replacment/g

Więc,

s/// oznacza wyszukiwanie i zamianę ciągu.

cdc_ to szukany ciąg.

dog_ jest ciąg zastępujący.

g to klucz globalny, który zastępuje każde wystąpienie ciągu.

Jak sprawdzić, czy zastąpienie Perla zadziałało

Poniższy wiersz wypisze każde wystąpienie szukanego ciągu cdc_:

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

Jeśli to nic nie zwraca, to cdc_ zostało zastąpione.

I odwrotnie, możesz użyć tego:

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

aby sprawdzić, czy zastępujący ciąg dog_, jest teraz wchromedriver pliku binarnym. Jeśli tak, ciąg zastępujący zostanie wydrukowany na konsoli.

Przejdź do zmienionego chromedriveri kliknij go dwukrotnie. terminalOkno powinno otworzyć. Jeśli nie widać killedna wyjściu, pomyślnie zmodyfikowałeś sterownik.


Podsumowanie

Po zmianie pliku chromedriverbinarnego upewnij się, że nazwa zmienionego pliku chromedriverbinarnego to chromedriveri że oryginalny plik binarny został przeniesiony z pierwotnej lokalizacji lub został przemianowany.


Moje doświadczenie z tą metodą

Wcześniej byłem wykrywany na stronie internetowej podczas próby zalogowania się, ale po zastąpieniu cdc_ciągiem o równej wielkości mogłem się zalogować. Podobnie jak inni mówili, jeśli już zostałeś wykryty, możesz zostać zablokowany mnóstwo innych powodów, nawet po użyciu tej metody. Być może będziesz musiał spróbować uzyskać dostęp do witryny, która wykrywała Cię za pomocą VPN, innej sieci lub tego, co masz.


@LekaBaper Dzięki za heads up. Użyłem wersji chromedrivera 2.41.578706.
colossatr0n

2
Nie działał nawet wtedy, gdy użyłem tej modyfikacji chromedriver.exe na nowym komputerze fizycznym w innej sieci.
Ahmed Memon

daje błąd mówi, że ta wersja nie działa na tym komputerze :(
Walid Bousseta

@ colossatr0n Czy istnieje niewykrywalny widelec typu open source, o którym wiesz?
ishandutta2007

3
Zauważ, że ludzie z chromedriver zadeklarowali, że ten problem nie zostanie naprawiony, więc możesz spodziewać się użycia widelca lub edycji pliku binarnego na czas nieokreślony. bugs.chromium.org/p/chromedriver/issues/detail?id=3220
Kodiologist

144

Zasadniczo sposób działania wykrywania selenu polega na tym, że testują one wstępnie zdefiniowane zmienne javascript, które pojawiają się podczas pracy z selenem. Skrypty wykrywające boty zwykle wyglądają na cokolwiek zawierające słowo „selenium” / „webdriver” w dowolnej zmiennej (na obiekcie okna), a także dokumentują zmienne o nazwie $cdc_i $wdc_. Oczywiście wszystko to zależy od używanej przeglądarki. Wszystkie przeglądarki prezentują różne rzeczy.

Dla mnie użyłem chrome, więc wszystko, co musiałem zrobić, to upewnić się, że $cdc_już nie istnieje jako zmienna dokumentu i voila (pobierz kod źródłowy chromedriver, zmodyfikuj chromedriver i ponownie skompiluj $cdc_pod inną nazwą).

to jest funkcja, którą zmodyfikowałem w 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];
}

(zwróć uwagę na komentarz, wszystko zrobiłem Odwróciłem $cdc_sięrandomblabla_ .

Oto pseudo-kod, który demonstruje niektóre techniki, z których mogą korzystać sieci botów:

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

według użytkownika @szx można również po prostu otworzyć plik chromedriver.exe w edytorze szesnastkowym i po prostu dokonać wymiany ręcznie, bez faktycznej kompilacji.


26
tak, zadziałało bez probów, zauważ, że jednym z problemów jest to, że wpadłeś na „czarną listę” PRZED tą zmianą, ciężko się wydostać. jeśli chcesz wyjść z istniejącej czarnej listy, musisz zaimplementować fałszywe odcisk palca, wyłączyć flash, zmienić adres IP i zmienić kolejność nagłówków żądań (zamień język i akceptuj nagłówki). Po wejściu na czarną listę mają bardzo dobre środki, aby cię śledzić, nawet jeśli zmienisz adres IP, nawet jeśli otworzysz chrome w trybie incognito itp.
Erti-Chris Eelmaa,

2
Znalazłem plik „/ Users / twoja_nazwa_użytkownika / chromium / src / chrome / test / chromedriver / js”
JonghoKim

6
Ja po prostu zastąpione $cdcze xxxxw chromedriver.exew edytorze hex i to działa! Zauważyłem również, że jeśli zmaksymalizujesz okno przeglądarki (zamiast używać wstępnie zdefiniowanego rozmiaru), jest ono wykrywane rzadziej.
szx

2
czy to było w systemie Windows, OSX lub Linux? Wydawanie szesnastkowe w systemie OSX wydaje się nie działać.
Nish

5
hex z edycją $ zzz_zzzzzzzzzzzzzzzzzzzz_ (taka sama liczba znaków), ale nie działał.
Aymon Fournier,

100

Jak już ustaliliśmy w pytaniu i opublikowanych odpowiedziach, w grze jest dostępna funkcja zapobiegania skrobaniu stron internetowych oraz usługa wykrywania botów o nazwie „Distil Networks” . I zgodnie z wywiadem prezesa firmy :

Mimo że mogą tworzyć nowe boty, opracowaliśmy sposób na identyfikację Selenium jako narzędzia, którego używają, więc blokujemy Selen bez względu na to, ile razy iterują na tym bocie . Robimy to teraz za pomocą Pythona i wielu różnych technologii. Kiedy widzimy wzorzec wyłaniający się z jednego rodzaju bota, pracujemy nad inżynierią wsteczną technologii, z której korzystają, i identyfikujemy go jako złośliwy.

Potrzeba czasu i dodatkowych wyzwań, aby zrozumieć, w jaki sposób dokładnie wykrywają selen, ale co możemy teraz powiedzieć na pewno:

  • nie jest to związane z działaniami podejmowanymi przy użyciu selenu - po przejściu na stronę natychmiast zostajesz wykryty i zbanowany. Próbowałem dodać sztuczne losowe opóźnienia między działaniami, zrobić przerwę po załadowaniu strony - nic nie pomogło
  • nie chodzi tu również o odcisk palca przeglądarki - wypróbowałem go w wielu przeglądarkach z czystymi profilami, a nie w trybach incognito - nic nie pomogło
  • ponieważ, zgodnie z podpowiedzią w wywiadzie, było to „inżynieria wsteczna”, podejrzewam, że dzieje się tak, gdy jakiś kod JS jest wykonywany w przeglądarce, co ujawnia, że ​​jest to przeglądarka zautomatyzowana za pośrednictwem selenium webdriver

Postanowiłem opublikować go jako odpowiedź, ponieważ wyraźnie:

Czy strona internetowa może wykryć, kiedy używasz selenu z chromedriver?

Tak.


Ponadto, z czym nie eksperymentowałem, to starsze selen i starsze wersje przeglądarek - teoretycznie może być coś zaimplementowane / dodane do selenu w pewnym momencie, na którym obecnie opiera się wykrywacz botów Distil Networks. Następnie, jeśli tak jest, możemy wykryć (tak, wykryjmy detektor), w którym punkcie / wersji dokonano odpowiedniej zmiany, zajrzyj do dziennika zmian i zestawów zmian, a może to dać nam więcej informacji na temat tego, gdzie szukać i czego używają do wykrywania przeglądarki napędzanej przez przeglądarkę internetową. To tylko teoria, którą należy przetestować.


@RyanWeinstein dobrze, nie mamy faktycznego dowodu i możemy jedynie spekulować i przetestować. Na razie powiedziałbym, że mają sposób na wykrycie nas za pomocą selenu. Spróbuj eksperymentować z wersjami selenu - może to dać ci wskazówki.
alecxe

1
Czy może to mieć związek z określaniem efemerycznych portów? Metoda nie obejmuje znanych zakresów. github.com/SeleniumHQ/selenium/blob/…
Elliott de Launay

9
Easyjet korzysta z usługi Distilnetwork, tak, może blokować atrapy botów, ale nie skomplikowane, ponieważ testowaliśmy je z ponad 2000 żądaniami dziennie z różnych adresów IP (które ponownie wykorzystujemy „tym samym” adresem), więc zasadniczo każdy adres IP przechodzi na 5-10 próśb dziennie i z tego mogę stwierdzić, że wszystkie te usługi wykrywania botów są właśnie tam, aby opracować i sprzedać około 45% działających algorytmów, skrobaczka, której użyliśmy, była łatwa do wykrycia, mogę ją zablokować podczas destilnetworks, squareshield i innych nie mogłem, co zmusiło mnie do nieużywania żadnego z nich.
Jeffery ThaGintoki

3
Myślę, że wykrywają navigator.webdriver w chrome webdriver. Próbowałem zrobić navigator.webdriver = false przy pomocy intoli.com/blog/not-possible-to-block-chrome-headless i stackoverflow.com/questions/47297877/... . Zwraca stronę wykrywania bota zamiast distilnetworks.com/distil_identify_cookie.html
hoozecn

24

Przykład implementacji na 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
dlaczego ostatnia próba nie jest zamknięta? poza tym możesz trochę wyjaśnić swoją odpowiedź.
ishandutta2007

16

Zaciemniający wynik JavaScript

Sprawdziłem kod źródłowy chromedriver. To wstrzykuje niektóre pliki javascript do przeglądarki.
Każdy plik javascript w tym linku jest wstrzykiwany na strony internetowe: https://chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/js/

Użyłem więc inżynierii wstecznej i zaciemniłem pliki js przez edycję szesnastkową. Teraz byłem pewien, że nie użyto już żadnej zmiennej javascript, nazw funkcji i ustalonych ciągów, aby odkryć aktywność selenu. Ale wciąż niektóre strony i reCaptcha wykrywają selen!
Może sprawdzają modyfikacje spowodowane przez wykonanie js chromedrivera :)


Edycja 1:

Modyfikacja parametrów przeglądarki Chrome

Odkryłem, że w nawigatorze są pewne parametry, które krótko odkrywają użycie chromedrivera. Oto parametry:

  • „navigator.webdriver” W trybie niezautomatyzowanym jest „niezdefiniowany”. W trybie automatycznym jest to „prawda”.
  • „navigator.plugins” Na chrome bezgłowym ma 0 długości. Dodałem więc kilka fałszywych elementów, aby oszukać proces sprawdzania długości wtyczek.
  • navigator.languages” ustawiono na domyślną wartość chrome „[„ en-US ”,„ en ”,„ es ”]”.

Potrzebowałem więc rozszerzenia chrome do uruchamiania javascript na stronach internetowych. Zrobiłem rozszerzenie z kodem js podanym w artykule i użyłem innego artykułu, aby dodać spakowane rozszerzenie do mojego projektu. Pomyślnie zmieniłem wartości; Ale nadal nic się nie zmieniło!

Nie znalazłem innych takich zmiennych, ale to nie znaczy, że one nie istnieją. Nadal reCaptcha wykrywa chromedriver, więc powinno być więcej zmiennych do zmiany. Kolejnym krokiem powinna być odwrotna inżynieria usług detekcyjnych, że nie chcę robić.

Teraz nie jestem pewien, czy warto poświęcić więcej czasu na ten proces automatyzacji lub poszukać alternatywnych metod!


12

Spróbuj użyć selenu z określonym profilem użytkownika chrome. W ten sposób możesz użyć go jako konkretnego użytkownika i zdefiniować dowolną rzecz, Gdy to zrobisz, będzie on działał jako „prawdziwy” użytkownik, spójrz na proces chrome z pewnym eksploratorem procesów i zobaczysz różnicę w tagach.

Na przykład:

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)

lista znaczników chrome tutaj


11

partial interface Navigator { readonly attribute boolean webdriver; };

Atrybut IDL webdriver interfejsu Navigator musi zwracać wartość flagi aktywnej webdriver, która początkowo jest fałszywa.

Ta właściwość pozwala stronom internetowym ustalić, że agent użytkownika jest kontrolowany przez WebDriver, i może być wykorzystana do ograniczenia ataków typu „odmowa usługi”.

Zaczerpnięty bezpośrednio z wersji Draft of WebDriver 2017 W3C Editor . To mocno sugeruje, że przynajmniej przyszłe iteracje sterowników selenu będą możliwe do zidentyfikowania, aby zapobiec niewłaściwemu użyciu. Ostatecznie trudno jest stwierdzić bez kodu źródłowego, co dokładnie powoduje, że konkretny sterownik chrome jest wykrywalny.


4
„trudno powiedzieć bez kodu źródłowego” .. cóż, kod źródłowy jest dostępny bezpłatnie
Corey Goldberg

6
Miałem na myśli bez kodu źródłowego danej witryny. Trudno powiedzieć, przeciwko czemu sprawdzają.
bryce,

8

Mówi się, że Firefox ustawia się podczas window.navigator.webdriver === truepracy z serwerem WWW. Było to zgodne ze starszą specyfikacją (np. Archive.org ), ale nie mogłem jej znaleźć w nowej z wyjątkiem bardzo niejasnych sformułowań w załącznikach.

Test jest przeprowadzany w kodzie selenu w pliku fingerprint_test.js, gdzie na końcu komentarza jest napisane: „Obecnie implementowane tylko w firefox”, ale nie byłem w stanie zidentyfikować żadnego kodu w tym kierunku za pomocą prostegogrep wpisania, ani w aktualne (41.0.2) Drzewo wydania Firefoksa ani drzewo Chromium.

Znalazłem również komentarz do starszego zatwierdzenia dotyczącego pobierania odcisków palców w sterowniku firefox b82512999938 od stycznia 2015 r . Ten kod nadal znajduje się w pobranym wczoraj programie Selenium GIT-master javascript/firefox-driver/extension/content/server.jsz komentarzem do nieco inaczej sformułowanego dodatku w aktualnej specyfikacji webdriver w3c.


2
Właśnie przetestowałem webdriver z Firefox 55 i mogę potwierdzić, że to nieprawda. Zmienna window.navigator.webdrivernie jest zdefiniowana.
speedplane

1
Aktualizacja: Testowałem z Firefoksem 65 i jest to prawdą:window.navigator.webdriver == true
Speedplane

Firefox w wersji 76 nadal pokazuje, że to prawda
user2284144

8

Oprócz świetnej odpowiedzi @ Erti-Chris Eelmaa - jest denerwujący window.navigator.webdriveri jest tylko do odczytu. Zdarzenie, jeśli zmienisz jego wartość na falseto, nadal będzie miało true. Właśnie dlatego wciąż można wykryć przeglądarkę obsługiwaną przez automatyczne oprogramowanie. MDN

Zmienną zarządza flaga --enable-automationw chrome. Chromedriver uruchamia chrome z tą flagą, a chrome ustawiawindow.navigator.webdriver się true. Możesz go znaleźć tutaj . Musisz dodać do flagi „wyklucz przełączniki”. Na przykład (golang):

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

Wygląda na to, że są za zaporą sieciową. Spójrz na modsecurity i owasp, aby zobaczyć, jak one działają. W rzeczywistości pytasz, jak zrobić unikanie wykrywania botów. Nie do tego służy selenowy sterownik sieciowy. Służy do testowania aplikacji sieci Web, aby nie trafiała na inne aplikacje. Jest to możliwe, ale w gruncie rzeczy trzeba by spojrzeć na to, czego szuka WAF w ich zestawie reguł, a zwłaszcza unikać selenu, jeśli możesz. Nawet wtedy może to nadal nie działać, ponieważ nie wiesz, jakiej używają WAF. Zrobiłeś dobry pierwszy krok, czyli sfałszowanie klienta. Jeśli to nie zadziałało, oznacza to, że WAF jest na miejscu i prawdopodobnie musisz być bardziej skomplikowany.

Edycja: Punkt zaczerpnięty z innej odpowiedzi. Najpierw upewnij się, że agent użytkownika jest ustawiony poprawnie. Może trafił na lokalny serwer internetowy lub wąchał ruch wychodzący.


Myślę, że podążasz właściwą ścieżką. Przetestowałem z moją instalacją i zastąpiłem agenta użytkownika prawidłowym ciągiem agenta użytkownika, który pomyślnie przeszedł i otrzymał ten sam wynik, stubhub zablokował żądanie.
Brian Cain

1
Ten temat jest bardzo obszerny, powiedziałbym, że jeśli go nie rozumiesz i chcesz to zrozumieć, tutaj nie jest właściwe miejsce. Zacznij od owasp. Sprawdź testy penetracyjne i bezpieczeństwo sieci. Ponadto, jak powiedziałem wcześniej, zajrzyj do modsecurity i WAF w tym temacie.
Bassel Samman

1
Jeśli byłby to problem z nagłówkiem HTTP, to czy normalna przeglądarka nie zostałaby zablokowana? Nagłówki HTTP są dokładnie takie same. Na co dokładnie patrzę z tym linkiem github? Czy próbowałeś używać selenu, aby przejść na stubhub? Coś jest bardzo nie tak.
Ryan Weinstein

1
Przepraszam za zamieszanie. Zajmę się tym i nie musisz mi więcej pomagać, jeśli nie chcesz. Większość mojego doświadczenia w programowaniu aplikacji systemowych, więc nie znałem zasad modsecurity, o których mówisz. Spojrzę i spróbuję się kształcić. Nie próbuję niczego omijać, chciałem tylko wiedzieć, w jaki sposób strony te wykrywają użytkownika używającego selenu.
Ryan Weinstein

1
Też jestem programistą :). Uczenie się jest przyczyną, dla której mogę się opóźnić. Nie mam nic przeciwko pomaganiu, chciałem tylko wyjaśnić, że nie znałem twoich intencji i nie mogłem dokładnie pomóc ci ominąć bezpieczeństwa ich witryny. Aby odpowiedzieć na twoje pytanie, to nie selen wykrywa. Reguły wykryły podejrzane zachowanie i postanowiły podjąć odpowiednie kroki przeciwko winnemu klientowi. Łapią cię za to, czego nie robisz więcej niż przez to, co robisz. W linku repozytorium możesz pobrać ten plik, aby uzyskać pomysł base_rules / modsecurity_crs_20_protocol_violations.conf
Bassel Samman

6

Nawet jeśli wysyłasz wszystkie właściwe dane (np. Selenium nie pojawia się jako rozszerzenie, masz rozsądną rozdzielczość / głębię bitów, i c), istnieje wiele usług i narzędzi, które profilują zachowanie użytkowników w celu ustalenia, czy aktor to użytkownik lub zautomatyzowany system.

Na przykład odwiedzenie witryny, a następnie natychmiastowe wykonanie jakiejś czynności poprzez przesunięcie myszy bezpośrednio do odpowiedniego przycisku, w mniej niż sekundę, jest czymś, czego nie zrobiłby żaden użytkownik.

Może być również przydatny jako narzędzie do debugowania, aby używać witryny, takiej jak https://panopticlick.eff.org/, aby sprawdzić, jak wyjątkowa jest Twoja przeglądarka; Pomoże to również zweryfikować, czy istnieją jakieś konkretne parametry wskazujące, że korzystasz z Selenium.


3
Korzystałem już z tej witryny, a odcisk palca jest identyczny z moją zwykłą przeglądarką. Poza tym niczego nie automatyzuję. Po prostu przeglądam jak zwykle.
Ryan Weinstein

6

Wykrywanie botów wydaje się bardziej skomplikowane lub przynajmniej inne niż to, co przeczytałem w odpowiedziach poniżej.

DOŚWIADCZENIE 1:

  1. Otwieram przeglądarkę i stronę internetową za pomocą Selenium z konsoli Python.
  2. Mysz jest już w określonym miejscu, w którym wiem, że link pojawi się po załadowaniu strony. Nigdy nie poruszam myszą.
  3. Naciskam lewy przycisk myszy raz (jest to konieczne, aby skupić się na konsoli, w której Python działa, na przeglądarce).
  4. Naciskam ponownie lewy przycisk myszy (pamiętaj, kursor znajduje się nad danym linkiem).
  5. Link otwiera się normalnie, tak jak powinien.

DOŚWIADCZENIE 2:

  1. Tak jak poprzednio, otwieram przeglądarkę i stronę internetową z Selenium z konsoli Python.

  2. Tym razem zamiast klikać myszą, używam Selenium (w konsoli Pythona) do klikania tego samego elementu z losowym przesunięciem.

  3. Link nie otwiera się, ale przechodzę do strony rejestracji.

IMPLIKACJE:

  • otwarcie przeglądarki internetowej za pośrednictwem Selenium nie wyklucza, żebym wyglądał na człowieka
  • poruszanie myszą jak człowiek nie musi być klasyfikowane jako człowiek
  • kliknięcie czegoś za pomocą Selenium z przesunięciem nadal wywołuje alarm

Wydaje się to tajemnicze, ale sądzę, że mogą po prostu ustalić, czy akcja pochodzi z Selenium, czy nie, nie dbając o to, czy sama przeglądarka została otwarta za pośrednictwem Selenium, czy nie. Czy mogą ustalić, czy okno ma fokus? Byłoby ciekawie usłyszeć, jeśli ktoś ma jakieś spostrzeżenia.


3
Wierzę, że Selenium wstrzykuje coś na stronę za pomocą javascript, aby znaleźć i uzyskać dostęp do elementów. Myślę, że to zastrzyk wykrywają.
zeusalmighty,

Masz rację, ten test jest w 100% ważny. Zrobiłem podobny test z tymi samymi wynikami. Mogę wysłać kartę Enter lub wysłać klucze. W momencie uzyskania dostępu do elementów strona przestała działać. Więc jeśli sterownik wstrzykuje trochę javascript do przeglądarki. Możemy po prostu zaszyfrować ten JavaScript za pomocą rozszerzenia chrome i odszyfrować na następnej stronie przy użyciu tego samego rozszerzenia. Spróbuję na to spojrzeć w następnych dniach.
trixo

6

Jeszcze jedną rzeczą, którą znalazłem, jest to, że niektóre strony internetowe używają platformy, która sprawdza agenta użytkownika. Jeśli wartość zawiera: „HeadlessChrome”, zachowanie może być dziwne podczas używania trybu bezgłowego.

Obejściem tego problemu będzie zastąpienie wartości agenta użytkownika, na przykład w Javie:

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

Niektóre strony wykrywają to:

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

To nie działa dla Chrome i Firefox, selenium 3.5.0, ChromeDriver 2.31.488774, geckodriver 0.18.0
jerrypy

4

Napisz stronę HTML z następującym kodem. Zobaczysz, że w DOM selenium stosuje atrybut webdriver w 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>


4
Ten atrybut jest dodawany tylko w przeglądarce Firefox.
Louis,

1
Możliwe jest usunięcie go z rozszerzenia selenu, które kontroluje przeglądarkę. To i tak zadziała.
m3nda

3

Znalazłem zmianę zmiennej „klucz” javascript w następujący sposób:

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

działa na niektórych stronach internetowych, gdy korzystamy z Selenium Webdriver wraz z Google Chrome, ponieważ wiele witryn sprawdza tę zmienną, aby uniknąć złomowania przez Selenium.


2

Wydaje mi się, że najprostszym sposobem na zrobienie tego z Selenium jest przechwycenie XHR, który odsyła odcisk palca przeglądarki.

Ale ponieważ jest to problem tylko z selenem, lepiej po prostu użyć czegoś innego. Selen ma ułatwić takie rzeczy, a nie o wiele trudniejsze.


Jakie są inne opcje selenu?
Tai,

Sądzę, że Żądania byłyby główną opcją Pythona. Jeśli wyślesz te same dokładne żądania, które wysyła Twoja przeglądarka, pojawi się jako zwykła przeglądarka.
pguardiario

2

Możesz spróbować użyć parametru „enable-automation”

var options = new ChromeOptions();

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

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

Chcę jednak ostrzec, że ta zdolność została naprawiona w ChromeDriver 79.0.3945.16 . Więc prawdopodobnie powinieneś użyć starszych wersji chrome.

Jako kolejną opcję możesz spróbować użyć InternetExplorerDriver zamiast Chrome. Jeśli chodzi o mnie, IE w ogóle nie blokuje się bez żadnych włamań.

Aby uzyskać więcej informacji, spójrz tutaj:

Selenium webdriver: Modyfikacja flagi navigator.webdriver, aby zapobiec wykryciu selenu

Nie można ukryć paska informacji „Chrome jest kontrolowany przez automatyczne oprogramowanie” w Chrome v76

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.