Một trang web có thể phát hiện khi bạn đang sử dụng selen với chromedriver không?


365

Tôi đã thử nghiệm Selenium với Chromedriver và tôi nhận thấy rằng một số trang có thể phát hiện ra rằng bạn đang sử dụng Selenium mặc dù không có tự động hóa nào cả. Ngay cả khi tôi chỉ duyệt thủ công chỉ bằng cách sử dụng chrome thông qua Selenium và Xephyr, tôi vẫn thường nhận được một trang nói rằng hoạt động đáng ngờ đã được phát hiện. Tôi đã kiểm tra tác nhân người dùng và dấu vân tay trình duyệt của tôi và tất cả chúng đều giống hệt với trình duyệt chrome thông thường.

Khi tôi duyệt đến các trang web này trong chrome bình thường, mọi thứ đều hoạt động tốt, nhưng thời điểm tôi sử dụng Selenium tôi đã phát hiện ra.

Về lý thuyết, chromedriver và chrome sẽ trông giống hệt như bất kỳ máy chủ web nào, nhưng bằng cách nào đó họ có thể phát hiện ra nó.

Nếu bạn muốn một số testcode hãy thử điều này:

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

Nếu bạn duyệt qua stubhub, bạn sẽ được chuyển hướng và 'bị chặn' trong một hoặc hai yêu cầu. Tôi đã nghiên cứu vấn đề này và tôi không thể hiểu làm thế nào họ có thể nói rằng người dùng đang sử dụng Selenium.

Họ làm nó như thế nào?

CẬP NHẬT EDIT:

Tôi đã cài đặt plugin Selenium IDE trong Firefox và tôi đã bị cấm khi tôi truy cập stubhub.com trong trình duyệt firefox bình thường chỉ với plugin bổ sung.

BIÊN TẬP:

Khi tôi sử dụng Fiddler để xem các yêu cầu HTTP được gửi qua lại tôi đã nhận thấy rằng các yêu cầu 'trình duyệt giả mạo' thường có 'không có bộ đệm' trong tiêu đề phản hồi.

BIÊN TẬP:

kết quả như thế này Có cách nào để phát hiện ra rằng tôi đang ở trang Selenium WebSearch từ Javascript đề xuất rằng không nên có cách nào để phát hiện khi bạn đang sử dụng webdo. Nhưng bằng chứng này cho thấy khác.

BIÊN TẬP:

Trang web tải một dấu vân tay lên máy chủ của họ, nhưng tôi đã kiểm tra và dấu vân tay của selen giống hệt với dấu vân tay khi sử dụng chrome.

BIÊN TẬP:

Đây là một trong những tải trọng vân tay mà họ gửi đến máy chủ của họ

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

Nó giống hệt nhau trong selen và chrome

BIÊN TẬP:

VPN hoạt động cho một lần sử dụng nhưng được phát hiện sau khi tôi tải trang đầu tiên. Rõ ràng một số javascript đang được chạy để phát hiện Selenium.


4
@RyanWeinstein: Nó không phải là giao thông. Tôi đoán là Selenium cần phơi bày một số móc JavaScript có thể được phát hiện trên JavaScript phía máy khách.
Mikko Ohtamaa

5
Hoặc nếu đó là lưu lượng truy cập thì đó là mẫu lưu lượng truy cập .... bạn đang duyệt các trang quá nhanh.
Mikko Ohtamaa

6
Tôi không duyệt quá nhanh. Tôi chỉ tải một trang duy nhất và tôi điều hướng qua nó bình thường bằng chuột và bàn phím. Ngoài ra, điều đó không có nghĩa là Selenium cần phơi bày các hook, bởi vì chrome.exe chạy theo nghĩa đen. Nó chỉ chạy chrome bình thường và cho phép bạn lấy dữ liệu từ nó. Còn ý tưởng nào khác không? Tôi đã nghĩ có lẽ nó có liên quan đến cookie. Điều này khiến tôi điên mất.
Ryan Weinstein

5
Trang web này sử dụng distillcông nghệ phát hiện bot và cung cấp nội dung sử dụng akamaitechnologies.comCDN từ khác nhau ip ví dụ 95.100.59.245, 104.70.243.66,23.202.161.241
SIslam

5
Tôi đang gặp vấn đề tương tự với Selenium và trình điều khiển firefox. Điều thú vị cần lưu ý là tôi đang chạy Selenium trong Máy ảo VMWare Workstation đang truy cập internet thông qua NAT. Máy chủ có thể truy cập stubhub, trong khi VM không thể truy cập khi sử dụng Selenium, hoặc thậm chí là phiên bản trình duyệt Selenium đã khởi chạy. Tôi đã có phiên bản VM Browser bị chặn và stubhub vẫn nhận ra máy và nó đã bị chặn. Vì vậy, nó phải được thực hiện một dấu vân tay của trình duyệt và máy theo một cách nào đó.
Brian Cain

Câu trả lời:


53

Dành cho người dùng Mac

Thay thế cdc_biến bằng Vim hoặc Perl

Bạn có thể sử dụng vim, hoặc như @Vic Seedoubleyew đã chỉ ra trong câu trả lời của @ Erti-Chris Eelmaa perl, để thay thế cdc_biến trong chromedriver( Xem bài đăng của @ Erti-Chris Eelmaa để tìm hiểu thêm về biến đó ). Sử dụng vimhoặc perlngăn bạn khỏi phải biên dịch lại mã nguồn hoặc sử dụng trình soạn thảo hex. Hãy chắc chắn để tạo một bản sao của bản gốc chromedrivertrước khi cố gắng chỉnh sửa nó. Ngoài ra, các phương pháp dưới đây đã được thử nghiệm chromedriver version 2.41.578706.


Sử dụng Vim

vim /path/to/chromedriver

Sau khi chạy dòng trên, bạn có thể sẽ thấy một loạt các từ vô nghĩa. Làm như sau:

  1. Tìm kiếm cdc_bằng cách gõ /cdc_và nhấn return.
  2. Cho phép chỉnh sửa bằng cách nhấn a.
  3. Xóa bất kỳ số lượng $cdc_lasutopfhvcZLmcflvà thay thế những gì đã bị xóa bằng một số lượng ký tự bằng nhau. Nếu bạn không, chromedriversẽ thất bại.
  4. Sau khi chỉnh sửa xong, nhấn esc.
  5. Để lưu các thay đổi và thoát, gõ :wq!và nhấn return.
  6. Nếu bạn không muốn lưu các thay đổi, nhưng bạn muốn thoát, nhập :q!và nhấn return.
  7. Bạn đã hoàn tất.

Đi đến thay đổi chromedrivervà nhấp đúp chuột vào nó. Một terminalcửa sổ sẽ mở ra. Nếu bạn không thấy killedtrong đầu ra, bạn đã thay đổi thành công trình điều khiển.


Sử dụng Perl

Dòng dưới đây thay thế cdc_bằng dog_:

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

Đảm bảo rằng chuỗi thay thế có cùng số ký tự với chuỗi tìm kiếm, nếu không chromedriversẽ thất bại.

Giải thích Perl

s///g biểu thị rằng bạn muốn tìm kiếm một chuỗi và thay thế nó trên toàn cầu bằng một chuỗi khác (thay thế tất cả các lần xuất hiện).

ví dụ, s/string/replacment/g

Vì thế,

s/// biểu thị tìm kiếm và thay thế một chuỗi.

cdc_ là chuỗi tìm kiếm.

dog_ là chuỗi thay thế.

g là khóa toàn cầu, thay thế mọi lần xuất hiện của chuỗi.

Làm thế nào để kiểm tra xem thay thế Perl có hoạt động không

Dòng sau sẽ in mọi lần xuất hiện của chuỗi tìm kiếm cdc_:

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

Nếu điều này trả về không có gì, thì cdc_đã được thay thế.

Ngược lại, bạn có thể sử dụng điều này:

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

để xem nếu chuỗi thay thế của bạn dog_, hiện đang ở dạng chromedrivernhị phân. Nếu có, chuỗi thay thế sẽ được in ra bàn điều khiển.

Đi đến thay đổi chromedrivervà nhấp đúp chuột vào nó. Một terminalcửa sổ sẽ mở ra. Nếu bạn không thấy killedtrong đầu ra, bạn đã thay đổi thành công trình điều khiển.


Kết thúc

Sau khi thay đổi chromedrivernhị phân, hãy đảm bảo rằng tên của chromedrivernhị phân đã thay đổi là chromedrivervà nhị phân gốc được chuyển từ vị trí ban đầu hoặc được đổi tên.


Kinh nghiệm của tôi với phương pháp này

Trước đây tôi đã bị phát hiện trên một trang web trong khi cố gắng đăng nhập, nhưng sau khi thay thế cdc_bằng một chuỗi có kích thước bằng nhau, tôi đã có thể đăng nhập. Giống như những người khác đã nói, nếu bạn đã bị phát hiện, bạn có thể bị chặn vì rất nhiều lý do khác ngay cả sau khi sử dụng phương pháp này. Vì vậy, bạn có thể phải thử truy cập vào trang web đang phát hiện bạn bằng VPN, mạng khác hoặc những gì có bạn.


@LekaBaper Cảm ơn vì đã ngẩng cao đầu. Phiên bản chromedriver mà tôi sử dụng là phiên bản 2.41.578706.
colossatr0n

2
Không hoạt động ngay cả khi tôi sử dụng sửa đổi chromedriver.exe này trên máy tính vật lý mới trên mạng khác.
Ahmed Memon

đó là một lỗi cho biết, phiên bản này không thể hoạt động trong máy tính này :(
Walid Bousseta 21/07/19

@ colossatr0n Có bất kỳ ngã ba nguồn mở nào mà bạn không biết?
ishandutta2007

3
Lưu ý rằng những người dùng chromedriver đã tuyên bố vấn đề này sẽ không được khắc phục, vì vậy bạn có thể phải sử dụng một ngã ba hoặc chỉnh sửa nhị phân cho tương lai không xác định. bug.chromium.org/p/chromedriver/issues/detail?id=3220
Nhà khoa học Kodi

144

Về cơ bản cách thức phát hiện selenium hoạt động, là họ kiểm tra các biến javascript được xác định trước xuất hiện khi chạy với selen. Các tập lệnh phát hiện bot thường trông bất cứ thứ gì có chứa từ "selenium" / "webdo" trong bất kỳ biến nào (trên đối tượng cửa sổ), và cả các tài liệu biến được gọi $cdc_$wdc_. Tất nhiên, tất cả điều này phụ thuộc vào trình duyệt bạn đang sử dụng. Tất cả các trình duyệt khác nhau phơi bày những thứ khác nhau.

Đối với tôi, tôi đã sử dụng chrome, vì vậy, tất cả những gì tôi phải làm là đảm bảo rằng $cdc_nó không còn tồn tại dưới dạng biến tài liệu và voila (tải xuống mã nguồn chromedriver, sửa đổi chromedriver và biên dịch lại $cdc_dưới tên khác.)

đây là chức năng tôi đã sửa đổi trong chromedriver:

call_feft.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];
}

(lưu ý nhận xét, tất cả những gì tôi đã làm tôi chuyển $cdc_sang randomblabla_.

Đây là một mã giả thể hiện một số kỹ thuật mà các mạng bot có thể sử dụng:

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

Theo người dùng @szx, bạn cũng có thể chỉ cần mở chromedriver.exe trong trình soạn thảo hex và chỉ cần thực hiện thay thế bằng tay mà không thực sự biên dịch.


26
vâng, nó hoạt động mà không có probs, lưu ý một vấn đề là nếu bạn rơi vào "danh sách đen" TRƯỚC KHI thay đổi này, thật khó để thoát ra. nếu bạn muốn thoát khỏi danh sách đen hiện có, bạn cần triển khai lấy dấu vân tay giả, tắt flash, thay đổi IP và thay đổi thứ tự tiêu đề yêu cầu (ngôn ngữ trao đổi và tiêu đề Chấp nhận). Khi bạn rơi vào danh sách đen, họ có các biện pháp rất tốt để theo dõi bạn, ngay cả khi bạn thay đổi IP, ngay cả khi bạn mở chrome trong ẩn danh, v.v.
Erti-Chris Eelmaa

2
Tôi tìm thấy tệp "/ Users / your_username / chromium / src / chrome / test / chromedriver / js"
JonghoKim

7
Tôi chỉ cần thay thế $cdcbằng xxxxtrong chromedriver.exemột trình soạn thảo hex và nó đã hoạt động! Tôi cũng nhận thấy rằng nếu bạn tối đa hóa cửa sổ trình duyệt (thay vì sử dụng kích thước được xác định trước) thì nó sẽ được phát hiện ít hơn.
szx

2
cái này trên windows, osx hay linux? Chỉnh sửa hex trên osx dường như không hoạt động.
Nish

5
chỉnh sửa hex với $ zzz_zzzzzzzzzzzzzzzzzzzzzzzz_ (cùng số lượng ký tự) nhưng không hoạt động.
Aymon Fournier

100

Như chúng ta đã tìm ra trong câu hỏi và câu trả lời được đăng, có một dịch vụ chống quét web và dịch vụ phát hiện Bot có tên là "Mạng lưới chưng cất" đang hoạt động ở đây. Và, theo cuộc phỏng vấn của CEO công ty :

Mặc dù họ có thể tạo ra các bot mới, chúng tôi đã tìm ra cách để xác định Selenium là công cụ họ đang sử dụng, vì vậy chúng tôi sẽ chặn Selenium bất kể họ lặp lại bao nhiêu lần trên bot đó . Bây giờ chúng tôi đang làm điều đó với Python và rất nhiều công nghệ khác nhau. Khi chúng tôi thấy một mô hình xuất hiện từ một loại bot, sau đó chúng tôi làm việc để thiết kế ngược lại công nghệ họ sử dụng và xác định nó là độc hại.

Sẽ mất thời gian và những thách thức bổ sung để hiểu chính xác họ đang phát hiện Selenium như thế nào, nhưng chúng ta có thể nói gì vào lúc này:

  • nó không liên quan đến các hành động bạn thực hiện với selenium - khi bạn điều hướng đến trang web, bạn sẽ bị phát hiện và cấm ngay lập tức. Tôi đã cố gắng thêm độ trễ ngẫu nhiên nhân tạo giữa các hành động, tạm dừng sau khi trang được tải - không có gì giúp được
  • đó cũng không phải là về dấu vân tay của trình duyệt - đã thử nó trong nhiều trình duyệt có cấu hình sạch và không, chế độ ẩn danh - không có gì giúp được
  • vì theo gợi ý trong cuộc phỏng vấn, đây là "kỹ thuật đảo ngược", tôi nghi ngờ điều này được thực hiện với một số mã JS được thực thi trong trình duyệt tiết lộ rằng đây là một trình duyệt được tự động hóa thông qua weben selenium

Quyết định đăng nó như một câu trả lời, vì rõ ràng:

Một trang web có thể phát hiện khi bạn đang sử dụng selen với chromedriver không?

Đúng.


Ngoài ra, những gì tôi chưa thử nghiệm là selen cũ và các phiên bản trình duyệt cũ hơn - về lý thuyết, có thể có một cái gì đó được triển khai / thêm vào selenium tại một điểm nhất định mà trình phát hiện bot của Distil Networks hiện đang dựa vào. Sau đó, nếu đây là trường hợp, chúng tôi có thể phát hiện (vâng, hãy phát hiện máy dò) tại điểm / phiên bản thay đổi có liên quan đã được thực hiện, xem xét thay đổi và thay đổi và, có thể, điều này có thể cung cấp cho chúng tôi thêm thông tin về nơi cần tìm và họ sử dụng cái gì để phát hiện trình duyệt hỗ trợ webroll. Đó chỉ là một lý thuyết cần được kiểm tra.


@RyanWeinstein tốt, chúng tôi không có bằng chứng thực tế và chúng tôi chỉ có thể suy đoán và kiểm tra. Hiện tại, tôi muốn nói rằng họ có cách để phát hiện chúng tôi bằng cách sử dụng selen. Hãy thử trải nghiệm với các phiên bản selen - điều này có thể cung cấp cho bạn một số manh mối.
alecxe

1
Nó có thể phải làm gì với cách xác định các cổng phù du? Phương pháp tránh xa các phạm vi nổi tiếng. github.com/SeleniumHQ/selenium/blob/ từ
Elliott de Launay

9
Easyjet đang sử dụng dịch vụ distilnetwork, vâng, nó có thể chặn các bot giả nhưng không phải là các bot phức tạp vì chúng tôi đã thử nghiệm nó với hơn 2000 yêu cầu mỗi ngày từ các IP khác nhau (mà chúng tôi sử dụng lại địa chỉ 'cùng một địa chỉ) 5-10 yêu cầu mỗi ngày và từ đó tôi có thể nói rằng tất cả các dịch vụ phát hiện bot này chỉ ở đó để phát triển và bán một số thuật toán hoạt động 45%, trình quét mà chúng tôi sử dụng rất dễ phát hiện tôi có thể chặn nó trong khi phá hủy mạng, squareshield và các dịch vụ khác không thể thúc đẩy tôi không bao giờ sử dụng bất kỳ trong số họ.
Jeffery ThaGintoki

3
Tôi nghĩ rằng họ đang phát hiện navigator.webdo trong chrome webdo. Tôi đã cố gắng tạo navigator.webdo = false với sự trợ giúp của intoli.com/blog/not-possible-to-block-chrome-headlessstackoverflow.com/questions/47297877/ . Nó trả về một trang phát hiện bot thay vì distilnetworks.com/distil_identify_cookie.html
hoozecn

24

Ví dụ về cách nó được thực hiện trên giếngfargo.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
Tại sao lần thử cuối cùng không đóng? ngoài ra bạn có thể giải thích câu trả lời của bạn một chút
ishandutta2007

16

Kết quả làm mờ JavaScripts

Tôi đã kiểm tra mã nguồn chromedriver. Điều đó tiêm một số tệp javascript vào trình duyệt.
Mỗi tệp javascript trên liên kết này được đưa vào các trang web: https://chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/js/

Vì vậy, tôi đã sử dụng kỹ thuật đảo ngược và làm xáo trộn các tệp js bằng cách chỉnh sửa Hex. Bây giờ tôi đã chắc chắn rằng không còn biến javascript, tên hàm và chuỗi cố định đã được sử dụng để khám phá hoạt động selen. Nhưng vẫn còn một số trang web và reCaptcha phát hiện selen!
Có lẽ họ kiểm tra các sửa đổi gây ra bởi thực thi js chromedriver :)


Chỉnh sửa 1:

Sửa đổi thông số 'điều hướng' của Chrome

Tôi phát hiện ra có một số thông số trong 'hoa tiêu' trong một thời gian ngắn phát hiện ra bằng cách sử dụng chromedriver. Đây là các tham số:

  • "navigator.webdo" Trên chế độ không tự động, đó là 'không xác định'. Trên chế độ tự động, đó là 'sự thật'.
  • "navigator.plugins" Trên chrome không đầu có độ dài 0. Vì vậy, tôi đã thêm một số yếu tố giả để đánh lừa quá trình kiểm tra độ dài plugin.
  • " navigator.lacular" được đặt thành giá trị chrome mặc định '["en-US", "en", "es"]'.

Vì vậy, những gì tôi cần là một tiện ích chrome để chạy javascript trên các trang web. Tôi đã thực hiện một phần mở rộng với mã js được cung cấp trong bài viết và sử dụng một bài viết khác để thêm phần mở rộng đã nén vào dự án của tôi. Tôi đã thay đổi thành công các giá trị; Nhưng vẫn không có gì thay đổi!

Tôi đã không tìm thấy các biến khác như thế này nhưng điều đó không có nghĩa là chúng không tồn tại. Vẫn reCaptcha phát hiện chromedriver, vì vậy cần có nhiều biến hơn để thay đổi. Bước tiếp theo là kỹ thuật đảo ngược các dịch vụ dò tìm mà tôi không muốn làm.

Bây giờ tôi không chắc có đáng để dành nhiều thời gian hơn cho quá trình tự động hóa này hay tìm kiếm các phương pháp thay thế!


12

Hãy thử sử dụng selenium với một hồ sơ người dùng cụ thể của chrome, Bằng cách đó bạn có thể sử dụng nó như một người dùng cụ thể và xác định bất kỳ điều gì bạn muốn, Khi làm như vậy nó sẽ chạy như một người dùng 'thực', hãy xem quy trình chrome với một số trình thám hiểm quy trình và bạn sẽ thấy sự khác biệt với các thẻ.

Ví dụ:

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)

danh sách thẻ chrome ở đây


11

partial interface Navigator { readonly attribute boolean webdriver; };

Thuộc tính IDL của webdo của giao diện Điều hướng phải trả về giá trị của cờ hoạt động webdo, ban đầu là sai.

Thuộc tính này cho phép các trang web xác định rằng tác nhân người dùng đang được WebDriver kiểm soát và có thể được sử dụng để giúp giảm thiểu các cuộc tấn công từ chối dịch vụ.

Lấy trực tiếp từ Dự thảo WebDriver của Biên tập viên W3C 2017 . Điều này ngụ ý nặng nề rằng ít nhất, các trình điều khiển của selenium trong tương lai sẽ được xác định để ngăn chặn việc sử dụng sai. Cuối cùng, thật khó để nói nếu không có mã nguồn, chính xác điều gì khiến trình điều khiển chrome cụ thể có thể được phát hiện.


4
"thật khó để nói mà không có mã nguồn" .. à, mã nguồn có sẵn miễn phí
Corey Goldberg

6
Tôi có nghĩa là không có trang web trong mã nguồn câu hỏi. Thật khó để nói những gì họ đang kiểm tra chống lại.
bryce

8

Firefox được cho là sẽ thiết lập window.navigator.webdriver === truenếu làm việc với webdo. Đó là theo một trong những thông số kỹ thuật cũ hơn (ví dụ: archive.org ) nhưng tôi không thể tìm thấy nó trong cái mới ngoại trừ một số từ ngữ rất mơ hồ trong phần phụ lục.

Một thử nghiệm cho nó nằm trong mã selenium trong tệp vân tay_test.js trong đó nhận xét ở cuối cho biết "Hiện tại chỉ được triển khai trong firefox" nhưng tôi không thể xác định bất kỳ mã nào theo hướng đó với một số đơn giảngrep , không phải trong hiện tại (41.0.2) Cây phát hành Firefox cũng như trong cây Chromium.

Tôi cũng tìm thấy một nhận xét cho một cam kết cũ hơn về việc lấy dấu vân tay trong trình điều khiển firefox b82512999938 từ tháng 1 năm 2015 . Mã đó vẫn còn trong Selenium GIT-master được tải xuống ngày hôm qua javascript/firefox-driver/extension/content/server.jsvới một bình luận liên kết đến phụ lục có từ hơi khác trong thông số webler w3c hiện tại.


2
Tôi mới thử nghiệm webroll với Firefox 55 và tôi có thể xác nhận điều này không đúng. Biến window.navigator.webdriverkhông được xác định.
bay siêu tốc

1
Cập nhật: Tôi đã thử nghiệm với Firefox 65 và điều này là đúng:window.navigator.webdriver == true
speedplane

Phiên bản Firefox 76 vẫn cho thấy nó là sự thật
user2284144

8

Ngoài ra với câu trả lời tuyệt vời của @ Erti-Chris Eelmaa - có phiền toái window.navigator.webdrivervà nó chỉ đọc. Sự kiện nếu bạn thay đổi giá trị của nó thành falsenó vẫn sẽ có true. Đó là lý do tại sao trình duyệt được điều khiển bởi phần mềm tự động vẫn có thể được phát hiện. MDN

Biến được quản lý bởi cờ --enable-automationtrong chrome. Chromedriver khởi chạy chrome với cờ đó và chrome đặt window.navigator.webdriverthành true. Bạn có thể tìm thấy nó ở đây . Bạn cần thêm vào "loại trừ các công tắc" cờ. Ví dụ: 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

Có vẻ như họ đứng sau một tường lửa ứng dụng web. Hãy xem modsecurance và owasp để xem cách chúng hoạt động. Trong thực tế, những gì bạn đang hỏi là làm thế nào để trốn tránh phát hiện bot. Đó không phải là những gì trình điều khiển web selenium dành cho. Nó là để kiểm tra ứng dụng web của bạn không đánh các ứng dụng web khác. Có thể, nhưng về cơ bản, bạn phải xem WAF tìm kiếm gì trong bộ quy tắc của họ và đặc biệt tránh nó bằng selen nếu bạn có thể. Ngay cả sau đó, nó vẫn có thể không hoạt động vì bạn không biết WAF họ đang sử dụng cái gì. Bạn đã làm đúng bước đầu tiên, đó là giả mạo tác nhân người dùng. Nếu điều đó không hiệu quả, thì WAF đã sẵn sàng và có lẽ bạn cần phải nhận được nhiều điều khó khăn hơn.

Chỉnh sửa: Điểm lấy từ câu trả lời khác. Hãy chắc chắn rằng tác nhân người dùng của bạn thực sự được đặt chính xác trước. Có thể nó đã đánh một máy chủ web cục bộ hoặc đánh hơi lưu lượng đi ra ngoài.


Tôi nghĩ rằng bạn đang đi đúng hướng. Tôi đã thử nghiệm với thiết lập của mình và thay thế Tác nhân người dùng bằng chuỗi tác nhân người dùng hợp lệ đã thực hiện thành công và nhận được kết quả tương tự, stubhub đã chặn yêu cầu.
Brian Cain

1
Chủ đề này rất rộng lớn, tôi sẽ nói nếu bạn không hiểu nó và bạn muốn hiểu nó, thì đây không phải là nơi thích hợp. Bắt đầu với con cú. Nhìn vào thử nghiệm thâm nhập và bảo mật web. Ngoài ra, như tôi đã nói trước đây, hãy xem xét modsecurance và WAF để biết cụ thể chủ đề này.
Bassel Samman

1
Nếu đó là sự cố tiêu đề HTTP thì trình duyệt bình thường có bị chặn không? Các tiêu đề HTTP hoàn toàn giống nhau. Ngoài ra chính xác những gì tôi đang xem với liên kết github đó? Bạn đã thử sử dụng selen để đi trên stubhub chưa? Một cái gì đó rất rất tắt.
Ryan Weinstein

1
Tôi xin lỗi vì sự nhầm lẫn. Tôi sẽ xem xét điều đó và bạn không phải giúp tôi nữa nếu bạn không muốn. Hầu hết kinh nghiệm của tôi là trong các ứng dụng hệ thống lập trình, vì vậy tôi không quen với các quy tắc bảo mật này mà bạn đang nói đến. Tôi sẽ xem và cố gắng giáo dục bản thân mình. Tôi không cố gắng bỏ qua bất cứ điều gì, tôi chỉ muốn biết làm thế nào các trang web này phát hiện người dùng bằng cách sử dụng selen.
Ryan Weinstein

1
Tôi cũng là một nhà phát triển :). Học hỏi là một nguyên nhân tôi có thể nhận được đằng sau. Tôi không ngại giúp đỡ, tôi chỉ muốn làm rõ rằng tôi không biết ý định của bạn và chính xác không thể giúp bạn bỏ qua bảo mật trang web của họ. Để trả lời câu hỏi của bạn, đó không phải là selen mà họ đang phát hiện. Các quy tắc phát hiện hành vi đáng ngờ và quyết định thực hiện các biện pháp thích hợp chống lại khách hàng vi phạm. Họ bắt bạn bởi những gì bạn không làm nhiều hơn những gì bạn đang làm. Trong liên kết repo, bạn có thể kiểm tra tệp này để có ý tưởng base_rules / modsecurity_crs_20_protatio_violations.conf
Bassel Samman

6

Ngay cả khi bạn đang gửi tất cả dữ liệu phù hợp (ví dụ: Selenium không hiển thị dưới dạng tiện ích mở rộng, bạn có độ phân giải / độ sâu bit hợp lý, & c), có một số dịch vụ và công cụ cấu hình hành vi của khách truy cập để xác định xem diễn viên là một người dùng hoặc một hệ thống tự động.

Ví dụ: truy cập một trang web sau đó sẽ ngay lập tức thực hiện một số hành động bằng cách di chuyển chuột trực tiếp đến nút có liên quan, trong chưa đầy một giây, là điều mà không người dùng nào thực sự sẽ làm.

Nó cũng có thể hữu ích như một công cụ gỡ lỗi để sử dụng một trang web như https://panopticlick.eff.org/ để kiểm tra mức độ độc đáo của trình duyệt của bạn; nó cũng sẽ giúp bạn xác minh xem có bất kỳ thông số cụ thể nào cho biết bạn đang chạy trong Selenium hay không.


3
Tôi đã sử dụng trang web đó và dấu vân tay giống hệt với trình duyệt thông thường của tôi. Ngoài ra tôi không tự động hóa bất cứ điều gì. Tôi chỉ duyệt như bình thường.
Ryan Weinstein

6

Phát hiện bot mà tôi thấy có vẻ phức tạp hơn hoặc ít nhất là khác với những gì tôi đã đọc qua trong các câu trả lời dưới đây.

THÍ NGHIỆM 1:

  1. Tôi mở trình duyệt và trang web với Selenium từ bảng điều khiển Python.
  2. Chuột đã ở một vị trí cụ thể nơi tôi biết một liên kết sẽ xuất hiện sau khi tải trang. Tôi không bao giờ di chuyển chuột.
  3. Tôi nhấn nút chuột trái một lần (điều này là cần thiết để lấy nét từ bảng điều khiển nơi Python đang chạy đến trình duyệt).
  4. Tôi nhấn nút chuột trái một lần nữa (hãy nhớ rằng, con trỏ ở trên một liên kết đã cho).
  5. Các liên kết mở bình thường, như nó nên.

KINH NGHIỆM 2:

  1. Như trước đây, tôi mở trình duyệt và trang web với Selenium từ bảng điều khiển Python.

  2. Lần này, thay vì nhấp chuột, tôi sử dụng Selenium (trong bảng điều khiển Python) để nhấp vào cùng một phần tử với phần bù ngẫu nhiên.

  3. Liên kết không mở, nhưng tôi được đưa đến một trang đăng ký.

HÀM Ý:

  • mở trình duyệt web qua Selenium không ngăn cản tôi xuất hiện con người
  • di chuyển chuột như người không cần thiết phải được phân loại là người
  • nhấp vào một cái gì đó qua Selenium với phần bù vẫn tăng báo động

Có vẻ bí ẩn, nhưng tôi đoán họ chỉ có thể xác định liệu một hành động có bắt nguồn từ Selenium hay không, trong khi họ không quan tâm liệu trình duyệt có được mở thông qua Selenium hay không. Hoặc họ có thể xác định nếu cửa sổ có tập trung? Sẽ rất thú vị để nghe nếu bất cứ ai có bất kỳ hiểu biết.


3
Tôi tin rằng Selenium tiêm thứ gì đó vào trang thông qua javascript để tìm và truy cập các yếu tố. Tiêm này là những gì tôi tin rằng họ đang phát hiện.
zeusalmighty

Bạn đã đúng, Bài kiểm tra này có hiệu lực 100%. Tôi đã làm thử nghiệm tương tự với kết quả tương tự. Tôi có thể gửi tab Enter hoặc gửi khóa. Khoảnh khắc tôi truy cập các phần tử trang ngừng hoạt động. Vì vậy, nếu trình điều khiển tiêm một số javascript vào trình duyệt. Chúng tôi chỉ có thể mã hóa javascript đó bằng cách sử dụng tiện ích mở rộng chrome và giải mã trên trang tiếp theo bằng cùng một tiện ích mở rộng. Tôi sẽ cố gắng nhìn vào nó sau những ngày.
trixo

6

Một điều nữa tôi thấy là một số trang web sử dụng một nền tảng kiểm tra Tác nhân người dùng. Nếu giá trị chứa: "HeadlessChrom", hành vi có thể lạ khi sử dụng chế độ không đầu.

Cách giải quyết cho điều đó sẽ là ghi đè giá trị tác nhân người dùng, ví dụ như trong 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

Một số trang web đang phát hiện điều này:

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

Điều này không hoạt động đối với Chrome và Firefox, selenium 3.5.0, ChromeDriver 2.31.488774, geckodriver 0.18.0
jerrypy

4

Viết một trang html với mã sau đây. Bạn sẽ thấy rằng trong DOM selenium áp dụng một thuộc tính webdo ở bên ngoàiHTML

<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
Thuộc tính chỉ được thêm vào trong Firefox.
Louis

1
Và có thể xóa nó khỏi phần mở rộng selen điều khiển trình duyệt. Nó sẽ làm việc nào.
m3nda

3

Tôi đã tìm thấy việc thay đổi biến "khóa" javascript như thế này:

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

hoạt động cho một số trang web khi sử dụng Selenium WebSearch cùng với Google Chrome, vì nhiều trang web kiểm tra biến này để tránh bị Selenium loại bỏ.


2

Dường như với tôi cách đơn giản nhất để làm điều đó với Selenium là chặn XHR gửi lại dấu vân tay của trình duyệt.

Nhưng vì đây là vấn đề chỉ có Selen, nên tốt hơn là sử dụng thứ khác. Selenium được cho là làm cho mọi thứ như thế này dễ dàng hơn, không khó hơn.


Các tùy chọn khác để selen là gì?
Tai

Tôi đoán Yêu cầu sẽ là tùy chọn python chính. Nếu bạn gửi cùng một yêu cầu chính xác mà trình duyệt của bạn gửi, bạn sẽ xuất hiện như một trình duyệt bình thường.
pguardiario

2

Bạn có thể thử sử dụng tham số "enable-tự động"

var options = new ChromeOptions();

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

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

Nhưng, tôi muốn cảnh báo rằng khả năng này đã được sửa trong ChromeDriver 79.0.3945.16 . Vì vậy, có lẽ bạn nên sử dụng các phiên bản cũ hơn của chrome.

Ngoài ra, như một tùy chọn khác, bạn có thể thử sử dụng InternetExplorerDriver thay vì Chrome. Đối với tôi, IE hoàn toàn không chặn mà không có bất kỳ hack nào.

Và để biết thêm thông tin hãy thử xem tại đây:

Selenium webdo: Sửa đổi cờ navigator.webdo để ngăn chặn phát hiện selen

Không thể ẩn "Chrome đang bị kiểm soát bởi phần mềm tự động" trong Chrome v76

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.