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.
źródło
distill
technologii wykrywania botów i dostarcza zawartość za pomocąakamaitechnologies.com
CDN od rozróżnianie ips np95.100.59.245
,104.70.243.66
,23.202.161.241
Odpowiedzi:
Dla użytkowników komputerów Mac
Zastępowanie
cdc_
zmiennej za pomocą Vima lub PerlaMożesz użyć
vim
lub, jak wskazał @Vic Seedoubleyew w odpowiedzi @ Erti-Chris Eelmaa,perl
zastąpićcdc_
zmienną wchromedriver
( Zobacz post @ Erti-Chris Eelmaa, aby dowiedzieć się więcej o tej zmiennej ). Użycievim
lubperl
zapobiega konieczności ponownej kompilacji kodu źródłowego lub użycia edytora szesnastkowego.chromedriver
Przed przystąpieniem do edycji należy wykonać kopię oryginału . Testowano również poniższe metodychromedriver version 2.41.578706
.Korzystanie z Vima
Po uruchomieniu powyższej linii prawdopodobnie zobaczysz kilka bełkotów. Wykonaj następujące czynności:
cdc_
, wpisując/cdc_
i naciskającreturn
.a
.$cdc_lasutopfhvcZLmcfl
i zastąp to, co zostało usunięte, znakami o równej ilości. Jeśli tego nie zrobisz,chromedriver
zawiedzie.esc
.:wq!
i naciśnijreturn
.:q!
i naciśnijreturn
.Przejdź do zmienionego
chromedriver
i kliknij go dwukrotnie.terminal
Okno powinno otworzyć. Jeśli nie widaćkilled
na wyjściu, pomyślnie zmodyfikowałeś sterownik.Korzystanie z Perla
Linia poniżej replaces
cdc_
zdog_
: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).Więc,
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
chromedriver
i kliknij go dwukrotnie.terminal
Okno powinno otworzyć. Jeśli nie widaćkilled
na wyjściu, pomyślnie zmodyfikowałeś sterownik.Podsumowanie
Po zmianie pliku
chromedriver
binarnego upewnij się, że nazwa zmienionego plikuchromedriver
binarnego tochromedriver
i ż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.źródło
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:
(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:
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.
źródło
$cdc
zexxxx
wchromedriver.exe
w 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.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 :
Potrzeba czasu i dodatkowych wyzwań, aby zrozumieć, w jaki sposób dokładnie wykrywają selen, ale co możemy teraz powiedzieć na pewno:
Postanowiłem opublikować go jako odpowiedź, ponieważ wyraźnie:
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ć.
źródło
Przykład implementacji na wellsfargo.com:
źródło
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:
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!
źródło
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:
lista znaczników chrome tutaj
źródło
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.
źródło
Mówi się, że Firefox ustawia się podczas
window.navigator.webdriver === true
pracy 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ą prostego
grep
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.js
z komentarzem do nieco inaczej sformułowanego dodatku w aktualnej specyfikacji webdriver w3c.źródło
window.navigator.webdriver
nie jest zdefiniowana.window.navigator.webdriver == true
Oprócz świetnej odpowiedzi @ Erti-Chris Eelmaa - jest denerwujący
window.navigator.webdriver
i jest tylko do odczytu. Zdarzenie, jeśli zmienisz jego wartość nafalse
to, nadal będzie miałotrue
. Właśnie dlatego wciąż można wykryć przeglądarkę obsługiwaną przez automatyczne oprogramowanie. MDNZmienną zarządza flaga
--enable-automation
w 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):źródło
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.
źródło
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.
źródło
Wykrywanie botów wydaje się bardziej skomplikowane lub przynajmniej inne niż to, co przeczytałem w odpowiedziach poniżej.
DOŚWIADCZENIE 1:
DOŚWIADCZENIE 2:
Tak jak poprzednio, otwieram przeglądarkę i stronę internetową z Selenium z konsoli Python.
Tym razem zamiast klikać myszą, używam Selenium (w konsoli Pythona) do klikania tego samego elementu z losowym przesunięciem.
Link nie otwiera się, ale przechodzę do strony rejestracji.
IMPLIKACJE:
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.
źródło
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:
źródło
Niektóre strony wykrywają to:
źródło
Napisz stronę HTML z następującym kodem. Zobaczysz, że w DOM selenium stosuje atrybut webdriver w outerHTML
źródło
Znalazłem zmianę zmiennej „klucz” javascript w następujący sposób:
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.
źródło
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.
źródło
Możesz spróbować użyć parametru „enable-automation”
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
źródło