Bisakah situs web mendeteksi ketika Anda menggunakan selenium dengan chromedriver?

365

Saya telah menguji Selenium dengan Chromedriver dan saya perhatikan bahwa beberapa halaman dapat mendeteksi bahwa Anda menggunakan Selenium meskipun tidak ada otomatisasi sama sekali. Bahkan ketika saya hanya menjelajah secara manual hanya menggunakan chrome melalui Selenium dan Xephyr saya sering mendapatkan halaman yang mengatakan bahwa aktivitas mencurigakan terdeteksi. Saya telah memeriksa agen pengguna saya, dan sidik jari browser saya, dan semuanya persis sama dengan browser chrome normal.

Ketika saya menjelajah ke situs-situs ini di chrome normal semuanya berfungsi dengan baik, tetapi saat saya menggunakan Selenium saya terdeteksi.

Secara teori chromedriver dan chrome seharusnya terlihat persis sama persis dengan server web mana pun, tetapi entah bagaimana mereka dapat mendeteksinya.

Jika Anda ingin beberapa kode uji coba ini:

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

Jika Anda menelusuri sekitar stubhub, Anda akan diarahkan dan 'diblokir' dalam satu atau dua permintaan. Saya telah menyelidiki ini dan saya tidak tahu bagaimana mereka bisa tahu bahwa pengguna menggunakan Selenium.

Bagaimana mereka melakukannya?

Perbarui EDIT:

Saya menginstal plugin Selenium IDE di Firefox dan saya diblokir ketika saya pergi ke stubhub.com di browser firefox normal hanya dengan plugin tambahan.

EDIT:

Ketika saya menggunakan Fiddler untuk melihat permintaan HTTP dikirim bolak-balik, saya perhatikan bahwa permintaan 'browser palsu' sering memiliki 'tanpa cache' di header respons.

EDIT:

hasil seperti ini Apakah ada cara untuk mendeteksi bahwa saya berada di halaman Selenium Webdriver dari Javascript menyarankan bahwa seharusnya tidak ada cara untuk mendeteksi ketika Anda menggunakan webdriver. Tetapi bukti ini menunjukkan sebaliknya.

EDIT:

Situs mengunggah sidik jari ke server mereka, tetapi saya memeriksa dan sidik jari selenium identik dengan sidik jari saat menggunakan chrome.

EDIT:

Ini adalah salah satu muatan sidik jari yang mereka kirim ke server mereka

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

Ini identik dalam selenium dan chrome

EDIT:

VPN berfungsi untuk sekali pakai tetapi terdeteksi setelah saya memuat halaman pertama. Jelas beberapa javascript sedang dijalankan untuk mendeteksi Selenium.

Ryan Weinstein
sumber
4
@RyanWeinstein: Ini bukan lalu lintas. Dugaan saya adalah bahwa Selenium perlu mengekspos beberapa kait JavaScript yang dapat dideteksi pada JavaScript sisi klien.
Mikko Ohtamaa
5
Atau jika itu lalu lintas maka itu adalah pola lalu lintas .... Anda menjelajah halaman terlalu cepat.
Mikko Ohtamaa
6
Saya tidak menjelajah terlalu cepat. Saya hanya memuat satu halaman dan saya menavigasi secara normal menggunakan mouse dan keyboard saya. Juga tidak masuk akal bahwa Selenium perlu mengekspos kait, karena secara harfiah menjalankan chrome.exe. Itu hanya menjalankan chrome normal dan memungkinkan Anda untuk mendapatkan data dari itu. Ada ide lain? Saya berpikir mungkin itu ada hubungannya dengan cookie. Ini membuatku gila.
Ryan Weinstein
5
Situs ini menggunakan distillteknologi deteksi bot dan memberikan konten menggunakan akamaitechnologies.comCDN dari berbeda ips misalnya 95.100.59.245, 104.70.243.66,23.202.161.241
SIslam
5
Saya mengalami masalah yang sama dengan Selenium dan driver firefox. Yang menarik untuk dicatat adalah saya menjalankan Selenium di VMWare Workstation Virtual Machine yang mengakses internet melalui NAT. Mesin host dapat mengakses stubhub, sedangkan VM tidak dapat mengakses ketika menggunakan Selenium, atau bahkan contoh browser Selenium diluncurkan. Saya memiliki instance VM Browser Diblokir dan stubhub masih mengenali mesin dan telah diblokir. Jadi itu harus melakukan sidik jari pada browser dan mesin dalam beberapa cara.
Brian Cain

Jawaban:

55

Untuk Pengguna Mac

Mengganti cdc_variabel menggunakan Vim atau Perl

Anda dapat menggunakan vim, atau seperti yang ditunjukkan @Vic Seedoubleyew dalam jawaban oleh @ Erti-Chris Eelmaa perl,, untuk mengganti cdc_variabel dalam chromedriver( Lihat pos oleh @ Erti-Chris Eelmaa untuk mempelajari lebih lanjut tentang variabel itu ). Menggunakan vimatau perlmencegah Anda dari harus mengkompilasi ulang kode sumber atau menggunakan hex-editor. Pastikan untuk membuat salinan asli chromedriversebelum mencoba mengeditnya. Juga, metode di bawah ini diuji chromedriver version 2.41.578706.


Menggunakan Vim

vim /path/to/chromedriver

Setelah menjalankan baris di atas, Anda mungkin akan melihat banyak omong kosong. Lakukan hal berikut:

  1. Cari cdc_dengan mengetik /cdc_dan menekan return.
  2. Aktifkan pengeditan dengan menekan a.
  3. Hapus jumlah apa pun $cdc_lasutopfhvcZLmcfldan ganti apa yang telah dihapus dengan jumlah karakter yang sama. Jika tidak, chromedriverakan gagal.
  4. Setelah selesai mengedit, tekan esc.
  5. Untuk menyimpan perubahan dan keluar, ketik :wq!dan tekan return.
  6. Jika Anda tidak ingin menyimpan perubahan, tetapi Anda ingin berhenti, ketikkan :q!dan tekan return.
  7. Kamu sudah selesai.

Pergi ke chromedriverklik yang diubah dan dobel di atasnya. Sebuah terminaljendela seharusnya terbuka. Jika Anda tidak melihat killeddi output, Anda berhasil mengubah driver.


Menggunakan Perl

Baris di bawah ini diganti cdc_dengan dog_:

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

Pastikan string pengganti memiliki jumlah karakter yang sama dengan string pencarian, jika tidak maka string chromedriverakan gagal.

Penjelasan Perl

s///g menunjukkan bahwa Anda ingin mencari string dan menggantinya secara global dengan string lain (menggantikan semua kemunculan).

misalnya, s/string/replacment/g

Begitu,

s/// menunjukkan pencarian dan penggantian string.

cdc_ adalah string pencarian.

dog_ adalah string pengganti.

g adalah kunci global, yang menggantikan setiap kemunculan string.

Cara memeriksa apakah penggantian Perl bekerja

Baris berikut akan mencetak setiap kemunculan string pencarian cdc_:

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

Jika ini tidak mengembalikan apa pun, maka cdc_telah diganti.

Sebaliknya, Anda dapat menggunakan ini:

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

untuk melihat apakah string pengganti Anda dog_,, sekarang dalam chromedriverbiner. Jika ya, string pengganti akan dicetak ke konsol.

Pergi ke chromedriverklik yang diubah dan dobel di atasnya. Sebuah terminaljendela seharusnya terbuka. Jika Anda tidak melihat killeddi output, Anda berhasil mengubah driver.


Membungkus

Setelah mengubah chromedriverbiner, pastikan bahwa nama chromedriverbiner yang diubah adalah chromedriver, dan biner asli dipindahkan dari lokasi aslinya atau diganti namanya.


Pengalaman Saya Dengan Metode Ini

Saya sebelumnya terdeteksi di situs web ketika mencoba masuk, tetapi setelah mengganti cdc_dengan string berukuran sama, saya bisa masuk. Seperti yang dikatakan orang lain, jika Anda sudah terdeteksi, Anda mungkin diblokir untuk kebanyakan alasan lain bahkan setelah menggunakan metode ini. Jadi, Anda mungkin harus mencoba mengakses situs yang mendeteksi Anda menggunakan VPN, jaringan yang berbeda, atau apa pun yang Anda miliki.

colossatr0n
sumber
@LekaBaper Terima kasih atas bantuannya. Versi chromedriver yang saya gunakan adalah versi 2.41.578706.
colossatr0n
2
Tidak berfungsi bahkan ketika saya menggunakan modifikasi chromedriver.exe ini pada komputer fisik baru di jaringan yang berbeda.
Ahmed Memon
itu memberikan kesalahan mengatakan, versi ini tidak dapat bekerja di komputer ini :(
Walid Bousseta
@ colossatr0n Apakah ada garpu open-source yang tidak terdeteksi yang Anda ketahui?
ishandutta2007
3
Perhatikan bahwa chromedriver orang telah menyatakan masalah ini tidak akan diperbaiki, jadi Anda dapat berharap harus menggunakan garpu atau mengedit biner untuk masa depan yang tidak terbatas. bugs.chromium.org/p/chromedriver/issues/detail?id=3220
Kodiologist
144

Pada dasarnya cara deteksi selenium bekerja, adalah bahwa mereka menguji variabel javascript yang telah ditentukan yang muncul saat dijalankan dengan selenium. Skrip deteksi bot biasanya terlihat apa pun yang mengandung kata "selenium" / "webdriver" di salah satu variabel (pada objek jendela), dan juga mendokumentasikan variabel yang disebut $cdc_dan $wdc_. Tentu saja, semua ini tergantung pada browser yang Anda gunakan. Semua browser yang berbeda memperlihatkan hal yang berbeda.

Bagi saya, saya menggunakan chrome, jadi, yang harus saya lakukan adalah memastikan bahwa $cdc_tidak ada lagi sebagai variabel dokumen, dan voila (unduh kode sumber chromedriver, modifikasi chromedriver dan kompilasi ulang $cdc_dengan nama yang berbeda.)

ini adalah fungsi yang saya modifikasi di 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];
}

(perhatikan komentar, semua yang saya lakukan saya beralih $cdc_ke randomblabla_.

Berikut adalah pseudo-code yang menunjukkan beberapa teknik yang mungkin digunakan jaringan bot:

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

menurut pengguna @szx, juga dimungkinkan untuk hanya membuka chromedriver.exe di hex editor, dan cukup melakukan penggantian secara manual, tanpa benar-benar melakukan kompilasi.

Erti-Chris Eelmaa
sumber
26
ya itu bekerja tanpa masalah, perhatikan satu masalah adalah jika Anda masuk ke dalam "daftar hitam" SEBELUM perubahan ini, cukup sulit untuk keluar. jika Anda ingin keluar dari daftar hitam yang ada, Anda perlu menerapkan sidik jari kanvas palsu, menonaktifkan flash, mengubah IP, dan mengubah urutan tajuk permintaan (bahasa swap dan header Terima). Setelah Anda masuk ke daftar hitam, mereka memiliki langkah-langkah yang sangat baik untuk melacak Anda, bahkan jika Anda mengubah IP, bahkan jika Anda membuka chrome dalam penyamaran, dll.
Erti-Chris Eelmaa
2
Saya menemukan file "/ Users / your_username / chromium / src / chrome / test / chromedriver / js"
JonghoKim
7
Saya hanya diganti $cdcdengan xxxxdi chromedriver.exedalam hex editor dan berhasil! Saya juga memperhatikan bahwa jika Anda memaksimalkan jendela browser (daripada menggunakan ukuran yang telah ditentukan) itu terdeteksi lebih jarang.
szx
2
apakah ini di windows, osx, atau linux? Pengeditan heks pada osx tampaknya tidak berfungsi.
Nish
5
heks-diedit dengan $ zzz_zzzzzzzzzzzzzzzzzzzzzz_ (jumlah karakter yang sama) tetapi tidak berfungsi.
Aymon Fournier
100

Seperti yang telah kita ketahui dalam pertanyaan dan jawaban yang diposting, ada layanan anti-pengikisan Web dan deteksi Bot yang disebut "Distil Networks" yang sedang dimainkan di sini. Dan, menurut wawancara CEO perusahaan :

Meskipun mereka dapat membuat bot baru, kami menemukan cara untuk mengidentifikasi Selenium alat yang mereka gunakan, jadi kami memblokir Selenium tidak peduli berapa kali mereka mengulangi bot itu . Kami melakukan itu sekarang dengan Python dan banyak teknologi berbeda. Setelah kami melihat pola muncul dari satu jenis bot, maka kami bekerja untuk merekayasa balik teknologi yang mereka gunakan dan mengidentifikasinya sebagai perangkat jahat.

Butuh waktu dan tantangan tambahan untuk memahami bagaimana tepatnya mereka mendeteksi Selenium, tetapi apa yang bisa kita katakan dengan pasti saat ini:

  • itu tidak terkait dengan tindakan yang Anda lakukan dengan selenium - setelah Anda menavigasi ke situs, Anda akan segera terdeteksi dan diblokir. Saya sudah mencoba menambahkan penundaan acak buatan antar tindakan, berhenti sejenak setelah halaman dimuat - tidak ada yang membantu
  • ini bukan tentang sidik jari browser - coba di beberapa browser dengan profil bersih dan tidak, mode penyamaran - tidak ada yang membantu
  • karena, menurut petunjuk dalam wawancara, ini adalah "reverse engineering", saya menduga ini dilakukan dengan beberapa kode JS yang dieksekusi di browser mengungkapkan bahwa ini adalah browser otomatis melalui selenium webdriver

Memutuskan untuk mengirimnya sebagai jawaban, karena jelas:

Bisakah situs web mendeteksi ketika Anda menggunakan selenium dengan chromedriver?

Iya.


Juga, apa yang saya belum bereksperimen dengan selenium yang lebih tua dan versi browser yang lebih tua - secara teori, mungkin ada sesuatu yang diimplementasikan / ditambahkan ke selenium pada titik tertentu yang mengandalkan pendeteksi bot jaringan Distil Networks. Kemudian, jika ini masalahnya, kita mungkin mendeteksi (yeah, mari kita deteksi detektor) pada titik / versi perubahan mana yang dibuat, lihat changelog dan changeets dan, mungkin, ini bisa memberi kita informasi lebih lanjut tentang ke mana harus mencari dan apa yang mereka gunakan untuk mendeteksi browser yang didukung webdriver. Itu hanya teori yang perlu diuji.

alecxe
sumber
@RyanWeinstein dengan baik, kami tidak memiliki bukti aktual dan kami hanya dapat berspekulasi dan menguji. Untuk saat ini, saya akan mengatakan mereka memiliki cara untuk mendeteksi kami menggunakan selenium. Coba bereksperimen dengan versi selenium - ini mungkin memberi Anda beberapa petunjuk.
alecxe
1
Mungkinkah ini terkait dengan bagaimana port fana ditentukan? Metode ini menjauh dari rentang yang terkenal. github.com/SeleniumHQ/selenium/blob/…
Elliott de Launay
9
Easyjet menggunakan layanan distilnetwork, ya itu dapat memblokir bot palsu tapi bukan yang rumit karena kami telah mengujinya dengan lebih dari 2000 permintaan sehari dari IP yang berbeda (yang kami gunakan kembali menggunakan alamat 'sama') jadi pada dasarnya setiap IP digunakan untuk 5-10 permintaan sehari dan dari sini saya bisa mengatakan bahwa semua layanan pendeteksi bot ini hanya ada untuk mengembangkan dan menjual sekitar 45% algoritme yang berfungsi, pencakar yang kami gunakan mudah dideteksi, saya dapat memblokirnya, sementara merusak jaringan, lapangan, dan lain-lain. tidak bisa yang mendorong saya untuk tidak pernah menggunakan salah satu dari mereka.
Jeffery ThaGintoki
3
Saya pikir mereka mendeteksi navigator.webdriver di chrome webdriver. Saya mencoba membuat navigator.webdriver = false dengan bantuan intoli.com/blog/not-possible-to-block-chrome-headless dan stackoverflow.com/questions/47297877/… . Ia mengembalikan halaman deteksi bot alih-alih distilnetworks.com/distil_identify_cookie.html
hoozecn
24

Contoh bagaimana penerapannya di 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
sumber
13
mengapa usaha terakhir tidak ditutup? selain itu, bisakah Anda menjelaskan jawaban Anda sedikit.
ishandutta2007
16

Mengacaukan hasil JavaScripts

Saya telah memeriksa kode sumber chromedriver. Itu menyuntikkan beberapa file javascript ke browser.
Setiap file javascript pada tautan ini disuntikkan ke halaman web: https://chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/js/

Jadi saya menggunakan teknik reverse dan mengaburkan file js dengan mengedit Hex. Sekarang saya yakin bahwa tidak ada lagi variabel javascript, nama fungsi dan string tetap yang digunakan untuk mengungkap aktivitas selenium. Namun masih beberapa situs dan reCaptcha mendeteksi selenium!
Mungkin mereka memeriksa modifikasi yang disebabkan oleh eksekusi js chromedriver :)


Edit 1:

Modifikasi parameter 'navigator' Chrome

Saya menemukan ada beberapa parameter dalam 'navigator' yang secara singkat mengungkap penggunaan chromedriver. Ini adalah parameternya:

  • "navigator.webdriver" Pada mode tidak otomatis itu 'tidak terdefinisi'. Pada mode otomatis, ini 'benar'.
  • "navigator.plugins" Pada chrome tanpa kepala memiliki panjang 0. Jadi saya menambahkan beberapa elemen palsu untuk mengelabui proses pemeriksaan panjang plugin.
  • " navigator.languages" disetel ke nilai chrome default '["en-US", "en", "es"]'.

Jadi yang saya butuhkan adalah ekstensi chrome untuk menjalankan javascript di halaman web. Saya membuat ekstensi dengan kode js yang disediakan dalam artikel dan menggunakan artikel lain untuk menambahkan ekstensi zip ke proyek saya. Saya telah berhasil mengubah nilai; Tapi tetap saja tidak ada yang berubah!

Saya tidak menemukan variabel lain seperti ini tetapi itu tidak berarti bahwa mereka tidak ada. Masih reCaptcha mendeteksi chromedriver, Jadi harus ada lebih banyak variabel untuk diubah. Langkah selanjutnya adalah melakukan reverse engineering pada layanan detektor yang tidak ingin saya lakukan.

Sekarang saya tidak yakin apakah perlu menghabiskan lebih banyak waktu untuk proses otomasi ini atau mencari metode alternatif!

ShayanKM
sumber
12

Cobalah untuk menggunakan selenium dengan profil pengguna tertentu dari chrome, Dengan cara itu Anda dapat menggunakannya sebagai pengguna tertentu dan mendefinisikan hal yang Anda inginkan. Ketika melakukannya, ia akan berjalan sebagai pengguna 'nyata', lihat proses chrome dengan beberapa proses explorer dan Anda akan melihat perbedaannya dengan tag.

Sebagai contoh:

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)

daftar tag chrome di sini

Kobi K
sumber
11

partial interface Navigator { readonly attribute boolean webdriver; };

Atribut IDdri webdriver dari antarmuka Navigator harus mengembalikan nilai bendera webdriver-aktif, yang awalnya salah.

Properti ini memungkinkan situs web untuk menentukan bahwa agen pengguna di bawah kendali oleh WebDriver, dan dapat digunakan untuk membantu mengurangi serangan penolakan layanan.

Diambil langsung dari Draft of WebDriver Editor W3C 2017 . Ini sangat menyiratkan bahwa setidaknya, iterasi driver selenium di masa depan akan dapat diidentifikasi untuk mencegah penyalahgunaan. Pada akhirnya, sulit untuk mengetahui tanpa kode sumber, apa yang sebenarnya menyebabkan driver chrome secara khusus dapat dideteksi.

Bryce
sumber
4
"Sulit untuk mengatakan tanpa kode sumber" .. baik kode sumber tersedia secara gratis
Corey Goldberg
6
Maksud saya tanpa situs web dalam kode sumber pertanyaan. Sulit untuk mengatakan apa yang mereka periksa.
bryce
8

Firefox dikatakan mengatur window.navigator.webdriver === truejika bekerja dengan driver web. Itu menurut salah satu spesifikasi yang lebih lama (misalnya: archive.org ) tetapi saya tidak dapat menemukannya di yang baru kecuali untuk beberapa kata yang sangat kabur dalam lampiran.

Sebuah tes untuk itu adalah dalam kode selenium dalam file fingerprint_test.js di mana komentar di akhir mengatakan "Saat ini hanya diimplementasikan dalam firefox" tapi saya tidak dapat mengidentifikasi kode apa pun dalam arah itu dengan beberapa cara sederhana grep, juga di saat ini (41.0.2) Firefox release-tree atau di pohon Chromium.

Saya juga menemukan komentar untuk komit yang lebih lama mengenai sidik jari pada driver firefox b82512999938 mulai Januari 2015 . Kode itu masih ada di Selenium GIT-master yang diunduh kemarin javascript/firefox-driver/extension/content/server.jsdengan komentar yang menghubungkan ke lampiran kata yang sedikit berbeda dalam spesifikasi webdriver w3c saat ini.

deamentiaemundi
sumber
2
Saya baru saja menguji webdriver dengan Firefox 55 dan saya dapat mengonfirmasi ini tidak benar. Variabel window.navigator.webdrivertidak didefinisikan.
speedplane
1
Pembaruan: Saya diuji dengan Firefox 65, dan ini benar:window.navigator.webdriver == true
speedplane
Firefox versi 76 masih menunjukkannya benar
user2284144
8

Selain jawaban yang bagus dari @ Erti-Chris Eelmaa - ada yang mengganggu window.navigator.webdriverdan hanya-baca. Acara jika Anda mengubah nilai falseitu masih akan ada true. Itulah sebabnya browser yang digerakkan oleh perangkat lunak otomatis masih dapat dideteksi. MDN

Variabel dikelola oleh bendera --enable-automationdi chrome. Chromedriver meluncurkan chrome dengan bendera itu dan chrome mengatur window.navigator.webdriveruntuk true. Anda dapat menemukannya di sini . Anda perlu menambahkan ke "mengecualikan switch" bendera. Misalnya (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))
}
FDG
sumber
6

Sepertinya mereka ada di balik firewall aplikasi web. Lihatlah modsecurity dan lihatlah bagaimana cara kerjanya. Pada kenyataannya, apa yang Anda tanyakan adalah bagaimana melakukan penghindaran deteksi bot. Bukan itu yang dimaksud dengan driver web selenium. Ini untuk menguji aplikasi web Anda agar tidak mengenai aplikasi web lainnya. Itu mungkin, tetapi pada dasarnya, Anda harus melihat apa yang WAF cari dalam aturan mereka dan secara khusus menghindarinya dengan selenium jika Anda bisa. Meski begitu, mungkin masih tidak berhasil karena Anda tidak tahu WAF apa yang mereka gunakan. Anda melakukan langkah pertama yang benar, yaitu memalsukan agen pengguna. Jika itu tidak berhasil, maka WAF sudah ada dan Anda mungkin perlu lebih rumit.

Sunting: Poin diambil dari jawaban lain. Pastikan agen pengguna Anda benar-benar disetel dengan benar terlebih dahulu. Mungkin itu menabrak server web lokal atau mengendus lalu lintas keluar.

Bassel Samman
sumber
Saya pikir Anda berada di jalan yang benar. Saya menguji dengan pengaturan saya dan mengganti Agen Pengguna dengan string agen pengguna yang valid yang berhasil melewati dan menerima hasil yang sama, stubhub memblokir permintaan.
Brian Cain
1
Topik ini sangat luas, saya akan mengatakan jika Anda tidak memahaminya, dan Anda ingin memahaminya, ini bukan tempat yang tepat. Mulai dengan owasp. Lihat ke dalam pengujian penetrasi dan keamanan web. Juga, seperti yang saya katakan sebelumnya, lihatlah modsecurity dan WAF untuk topik ini secara spesifik.
Bassel Samman
1
Jika itu masalah HTTP header maka bukankah browser normal akan diblokir? Header HTTP persis sama. Juga apa sebenarnya yang saya lihat dengan tautan github itu? Sudahkah Anda mencoba menggunakan selenium untuk menjalankan stubhub? Sesuatu sangat sangat buruk.
Ryan Weinstein
1
Saya minta maaf atas kebingungannya. Saya akan melihat ke dalam itu dan Anda tidak perlu membantu saya lagi jika Anda tidak mau. Sebagian besar pengalaman saya adalah dalam aplikasi sistem pemrograman, jadi saya tidak terbiasa dengan aturan modsecurity yang Anda bicarakan. Saya akan melihat dan mencoba mendidik diri sendiri. Saya tidak mencoba memintas apa pun, saya hanya tertarik mengetahui bagaimana situs-situs ini mendeteksi pengguna yang menggunakan selenium.
Ryan Weinstein
1
Saya juga seorang pengembang :). Belajar adalah alasan yang bisa saya dapatkan. Saya tidak keberatan membantu, saya hanya ingin menjelaskan bahwa saya tidak tahu niat Anda dan tidak bisa membantu Anda memintas keamanan situs web mereka. Untuk menjawab pertanyaan Anda, bukan selenium yang mereka deteksi. Aturan mendeteksi perilaku yang mencurigakan dan memutuskan untuk mengambil tindakan yang sesuai terhadap klien yang menyinggung. Mereka menangkap Anda dengan apa yang tidak Anda lakukan lebih dari apa yang Anda lakukan. Di tautan repo, Anda dapat checkout file ini untuk mendapatkan ide base_rules / modsecurity_crs_20_protocol_violations.conf
Bassel Samman
6

Sekalipun Anda mengirim semua data yang benar (mis. Selenium tidak muncul sebagai ekstensi, Anda memiliki resolusi / bit-depth yang masuk akal, & c), ada sejumlah layanan dan alat yang profil pengunjung perilaku untuk menentukan apakah aktor adalah pengguna atau sistem otomatis.

Misalnya, mengunjungi situs kemudian langsung akan melakukan beberapa tindakan dengan menggerakkan mouse langsung ke tombol yang relevan, dalam waktu kurang dari satu detik, adalah sesuatu yang tidak akan dilakukan oleh pengguna.

Mungkin juga bermanfaat sebagai alat debugging untuk menggunakan situs seperti https://panopticlick.eff.org/ untuk memeriksa seberapa unik peramban Anda; itu juga akan membantu Anda memverifikasi apakah ada parameter spesifik yang menunjukkan Anda menjalankan di Selenium.

lfaraone
sumber
3
Saya sudah menggunakan situs web itu dan sidik jari identik dengan peramban normal saya. Juga saya tidak mengotomatisasi apa pun. Saya hanya menjelajah seperti biasa.
Ryan Weinstein
6

Deteksi bot yang saya lihat tampaknya lebih canggih atau setidaknya berbeda dari apa yang saya baca dalam jawaban di bawah ini.

EKSPERIMEN 1:

  1. Saya membuka browser dan halaman web dengan Selenium dari konsol Python.
  2. Mouse sudah berada di lokasi tertentu di mana saya tahu tautan akan muncul setelah halaman dimuat. Saya tidak pernah memindahkan mouse.
  3. Saya menekan tombol kiri mouse sekali (ini perlu untuk mengambil fokus dari konsol tempat Python berjalan ke browser).
  4. Saya menekan tombol kiri mouse lagi (ingat, kursor berada di atas tautan yang diberikan).
  5. Tautan terbuka secara normal, sebagaimana mestinya.

EKSPERIMEN 2:

  1. Seperti sebelumnya, saya membuka browser dan halaman web dengan Selenium dari konsol Python.

  2. Kali ini, alih-alih mengklik dengan mouse, saya menggunakan Selenium (di konsol Python) untuk mengklik elemen yang sama dengan offset acak.

  3. Tautan tidak terbuka, tetapi saya dibawa ke halaman pendaftaran.

IMPLIKASI:

  • membuka peramban web melalui Selenium tidak menghalangi saya untuk tampil sebagai manusia
  • menggerakkan mouse seperti manusia tidak perlu diklasifikasikan sebagai manusia
  • mengklik sesuatu melalui Selenium dengan offset masih meningkatkan alarm

Tampaknya misterius, tetapi saya kira mereka hanya dapat menentukan apakah suatu tindakan berasal dari Selenium atau tidak, sementara mereka tidak peduli apakah browser itu sendiri dibuka melalui Selenium atau tidak. Atau dapatkah mereka menentukan apakah jendela memiliki fokus? Akan menarik untuk didengar jika ada yang memiliki wawasan.

M3RS
sumber
3
Keyakinan saya adalah bahwa Selenium menyuntikkan sesuatu ke halaman melalui javascript untuk menemukan dan mengakses elemen. Injeksi ini adalah apa yang saya yakini mereka deteksi.
zeusalmighty
Anda benar, Tes ini 100% valid. Saya telah melakukan tes serupa dengan hasil yang sama. Saya bisa mengirim tab Enter atau mengirim kunci. Saat saya mengakses elemen halaman berhenti berfungsi. Jadi, jika driver menyuntikkan beberapa javascript ke browser. Kami hanya bisa mengenkripsi javascript itu menggunakan ekstensi chrome dan mendekripsi pada halaman berikutnya menggunakan ekstensi yang sama. Saya akan mencoba melihatnya beberapa hari kemudian.
trixo
6

Satu hal lagi yang saya temukan adalah beberapa situs web menggunakan platform yang memeriksa Agen Pengguna. Jika nilainya berisi: "HeadlessChrome", tingkah lakunya bisa aneh ketika menggunakan mode tanpa kepala.

Solusi untuk itu adalah mengganti nilai agen pengguna, misalnya di Jawa:

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");
Adi Ohana
sumber
5

Beberapa situs mendeteksi ini:

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) {}
Néstor
sumber
Ini tidak berfungsi untuk Chrome dan Firefox, selenium 3.5.0, ChromeDriver 2.31.488774, geckodriver 0.18.0
jerrypy
4

Tulis halaman html dengan kode berikut. Anda akan melihat bahwa dalam selenium DOM menerapkan atribut webdriver di 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>

PC3TJ
sumber
4
Atribut hanya ditambahkan di Firefox.
Louis
1
Dan dimungkinkan untuk menghapusnya dari ekstensi selenium yang mengontrol browser. Lagipula itu akan berhasil.
m3nda
3

Saya telah menemukan mengubah variabel "kunci" javascript seperti ini:

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

berfungsi untuk beberapa situs web saat menggunakan Selenium Webdriver bersama dengan Google Chrome, karena banyak situs memeriksa variabel ini untuk menghindari pembatalan oleh Selenium.

Juliagu
sumber
2

Menurut saya cara paling sederhana untuk melakukannya dengan Selenium adalah dengan mencegat XHR yang mengirimkan kembali sidik jari peramban.

Tetapi karena ini adalah masalah Selenium saja, lebih baik hanya menggunakan sesuatu yang lain. Selenium seharusnya membuat hal-hal seperti ini lebih mudah, bukan cara yang lebih sulit.

pguardiario
sumber
Apa pilihan lain untuk selenium?
Tai
Saya kira Permintaan akan menjadi opsi python utama. Jika Anda mengirim permintaan persis yang sama dengan yang dikirimkan browser Anda, Anda akan muncul sebagai browser normal.
pguardiario
2

Anda dapat mencoba menggunakan parameter "enable-automation"

var options = new ChromeOptions();

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

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

Tetapi, saya ingin memperingatkan bahwa kemampuan ini telah diperbaiki di ChromeDriver 79.0.3945.16 . Jadi mungkin Anda harus menggunakan versi chrome yang lebih lama.

Selain itu, sebagai opsi lain, Anda dapat mencoba menggunakan InternetExplorerDriver alih-alih Chrome. Bagi saya, IE tidak memblokir sama sekali tanpa peretasan.

Dan untuk info lebih lanjut coba lihat di sini:

Selenium webdriver: Memodifikasi flag navigator.webdriver untuk mencegah deteksi selenium

Tidak dapat menyembunyikan infobar "Chrome sedang dikendalikan oleh perangkat lunak otomatis" di dalam Chrome v76

Sergiy Matvienko
sumber