크롬 드라이버와 함께 셀레늄을 사용할 때 웹 사이트에서 감지 할 수 있습니까?


364

Chromedriver로 Selenium을 테스트 한 결과 자동화가 전혀 없어도 일부 페이지에서 Selenium을 사용하고 있음을 감지 할 수 있습니다. Selenium과 Xephyr을 통해 크롬을 사용하여 수동으로 탐색하는 경우에도 의심스러운 활동이 감지되었다는 페이지가 종종 나타납니다. 사용자 에이전트와 브라우저 지문을 확인했으며 모두 일반 크롬 브라우저와 동일합니다.

정상적인 크롬 으로이 사이트를 탐색하면 모든 것이 잘 작동하지만 Selenium을 사용하는 순간 감지됩니다.

이론적으로 chromedriver와 chrome은 문자 그대로 모든 웹 서버와 동일하게 보이지만 어떻게 든 감지 할 수 있습니다.

테스트 코드를 원하면 다음을 시도하십시오.

from pyvirtualdisplay import Display
from selenium import webdriver

display = Display(visible=1, size=(1600, 902))
display.start()
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--disable-extensions')
chrome_options.add_argument('--profile-directory=Default')
chrome_options.add_argument("--incognito")
chrome_options.add_argument("--disable-plugins-discovery");
chrome_options.add_argument("--start-maximized")
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.delete_all_cookies()
driver.set_window_size(800,800)
driver.set_window_position(0,0)
print 'arguments done'
driver.get('http://stubhub.com')

stubhub를 탐색하면 하나 또는 두 개의 요청 내에서 리디렉션되고 '차단'됩니다. 나는 이것을 조사하고 있으며 사용자가 셀레늄을 사용하고 있음을 어떻게 알 수 있는지 알 수 없습니다.

그들은 그걸 어떻게 햇어?

업데이트 편집 :

Firefox에 Selenium IDE 플러그인을 설치했으며 추가 플러그인만으로 일반 firefox 브라우저에서 stubhub.com에 갈 때 금지되었습니다.

편집하다:

Fiddler를 사용하여주고받는 HTTP 요청을 볼 때 '가짜 브라우저'요청이 응답 헤더에 '노 캐시 없음'을 가지고 있음을 알았습니다.

편집하다:

Javascript의 Selenium Webdriver 페이지에 있다는 것을 감지하는 방법있습니까? 웹 드라이버를 사용할 때 감지 할 수있는 방법이 없어야합니다. 그러나이 증거는 그렇지 않다는 것을 암시합니다.

편집하다:

이 사이트는 서버에 지문을 업로드하지만 크롬을 사용할 때 셀레늄의 지문이 지문과 동일하다는 것을 확인했습니다.

편집하다:

이것은 서버로 보내는 지문 페이로드 중 하나입니다.

{"appName":"Netscape","platform":"Linuxx86_64","cookies":1,"syslang":"en-US","userlang":"en-US","cpu":"","productSub":"20030107","setTimeout":1,"setInterval":1,"plugins":{"0":"ChromePDFViewer","1":"ShockwaveFlash","2":"WidevineContentDecryptionModule","3":"NativeClient","4":"ChromePDFViewer"},"mimeTypes":{"0":"application/pdf","1":"ShockwaveFlashapplication/x-shockwave-flash","2":"FutureSplashPlayerapplication/futuresplash","3":"WidevineContentDecryptionModuleapplication/x-ppapi-widevine-cdm","4":"NativeClientExecutableapplication/x-nacl","5":"PortableNativeClientExecutableapplication/x-pnacl","6":"PortableDocumentFormatapplication/x-google-chrome-pdf"},"screen":{"width":1600,"height":900,"colorDepth":24},"fonts":{"0":"monospace","1":"DejaVuSerif","2":"Georgia","3":"DejaVuSans","4":"TrebuchetMS","5":"Verdana","6":"AndaleMono","7":"DejaVuSansMono","8":"LiberationMono","9":"NimbusMonoL","10":"CourierNew","11":"Courier"}}

셀레늄과 크롬에서 동일

편집하다:

VPN은 일회용으로 작동하지만 첫 페이지를로드 한 후에 감지됩니다. 분명히 셀레늄을 감지하기 위해 일부 자바 스크립트가 실행 중입니다.


4
@RyanWeinstein : 트래픽이 아닙니다. 내 생각에 Selenium은 클라이언트 측 JavaScript에서 감지 할 수있는 JavaScript 후크를 노출해야한다고 생각합니다.
Mikko Ohtamaa

5
또는 트래픽 인 경우 트래픽 패턴입니다. 페이지를 너무 빨리 탐색하고 있습니다.
Mikko Ohtamaa

6
너무 빨리 탐색하지 않습니다. 단일 페이지 만로드하고 마우스와 키보드를 사용하여 정상적으로 페이지를 탐색합니다. 또한 Selenium은 말 그대로 chrome.exe를 실행하기 때문에 후크를 노출해야한다는 것은 의미가 없습니다. 일반 크롬 만 실행하고 데이터를 가져올 수 있습니다. 다른 아이디어가 있습니까? 쿠키와 관련이 있다고 생각했습니다. 이것은 나를 미치게합니다.
Ryan Weinstein

5
이 사이트는 사용 distill봇 탐지 기술 및 사용하여 콘텐츠 제공 akamaitechnologies.comdiffrent IPS 예에서 CDN을 95.100.59.245, 104.70.243.66,23.202.161.241
SIslam

5
Selenium과 firefox 드라이버에서 동일한 문제가 발생합니다. 흥미로운 점은 NAT를 통해 인터넷에 액세스하는 VMWare Workstation 가상 머신에서 Selenium을 실행하고 있다는 것입니다. 호스트 시스템은 stubhub에 액세스 할 수있는 반면 Selenium을 사용하거나 브라우저 인스턴스 Selenium을 시작할 때 VM은 액세스 할 수 없습니다. VM 브라우저 인스턴스를 차단했으며 stubhub은 여전히 ​​머신을 인식하고 차단했습니다. 따라서 어떤 방식 으로든 브라우저와 컴퓨터의 지문을 수행해야합니다.
Brian Cain

답변:


51

Mac 사용자의 경우

cdc_Vim 또는 Perl을 사용하여 변수 바꾸기

당신은 사용할 수 있습니다 vim, 또는 @Vic Seedoubleyew이 Erti - 크리스 Eelmaa @에 의해이 질문에 대해 지적대로 perl의 교체 cdc_에 변수 chromedriver( Erti - 크리스 Eelmaa 더 그 변수에 대한 자세한 내용은 @에 의해 참조 게시물을 ). 사용 vim또는 perl소스 코드를 컴파일 또는 헥스 편집기를 사용 할 필요가 없습니다. 원본 chromedriver을 편집하기 전에 사본을 만들어 두십시오. 또한 아래 방법을 테스트했습니다 chromedriver version 2.41.578706.


Vim 사용

vim /path/to/chromedriver

위의 줄을 실행하면 아마도 많은 횡설수설을 보게 될 것입니다. 다음을 수행하십시오.

  1. cdc_을 입력하고을 /cdc_눌러 검색하십시오 return.
  2. 를 눌러 편집을 활성화하십시오 a.
  3. 금액을 $cdc_lasutopfhvcZLmcfl삭제하고 삭제 된 내용을 같은 양의 문자로 바꿉니다. 그렇지 않으면 chromedriver실패합니다.
  4. 편집이 끝나면를 누릅니다 esc.
  5. 변경 사항을 저장하고 종료하려면을 입력하고을 :wq!누르십시오 return.
  6. 변경 사항을 저장하지 않고 종료하려면을 입력하고을 :q!누릅니다 return.
  7. 끝났습니다.

변경된 것으로 이동하여 chromedriver두 번 클릭하십시오. terminal창이 열립니다. killed출력에 표시되지 않으면 드라이버를 성공적으로 변경 한 것입니다.


펄 사용하기

을 대체 아래의 라인 cdc_을 가진 dog_:

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

대체 문자열이 검색 문자열과 동일한 수의 문자를 갖는지 확인하십시오 chromedriver. 그렇지 않으면 실패합니다.

펄 설명

s///g 은 문자열을 검색하여 전체적으로 다른 문자열로 교체 함을 나타냅니다 (모든 항목을 대체 함).

예를 들어 s/string/replacment/g

그래서,

s/// 문자열 검색 및 교체를 나타냅니다.

cdc_ 검색 문자열입니다.

dog_ 교체 문자열입니다.

g 문자열의 모든 발생을 대체하는 전역 키입니다.

Perl 교체가 작동했는지 확인하는 방법

다음 줄은 모든 검색 문자열을 인쇄합니다 cdc_.

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

이것이 아무것도 반환되지 않으면 cdc_교체 된 것입니다.

반대로 다음을 사용할 수 있습니다.

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

대체 문자열 dog_이 이제 chromedriver바이너리 에 있는지 확인하십시오 . 이 경우 교체 문자열이 콘솔에 인쇄됩니다.

변경된 것으로 이동하여 chromedriver두 번 클릭하십시오. terminal창이 열립니다. killed출력에 표시되지 않으면 드라이버를 성공적으로 변경 한 것입니다.


마무리

chromedriver이진을 변경 한 후 변경된 chromedriver이진 의 이름 이 chromedriver이고 원본 이진이 원래 위치에서 이동하거나 이름이 바뀌 었는지 확인하십시오.


이 방법에 대한 나의 경험

이전에 웹 사이트에서 로그인을 시도하는 동안 감지되었지만 cdc_동일한 크기의 문자열로 교체 한 후 로그인 할 수있었습니다. 다른 사람들이 말했듯이 이미 감지 된 경우 이 방법을 사용한 후에도 다른 많은 이유가 있습니다. 따라서 VPN, 다른 네트워크 또는 자신이있는 것을 사용하여 탐지 한 사이트에 액세스해야 할 수도 있습니다.


@LekaBaper 감사합니다. 내가 사용한 chromedriver 버전은 2.41.578706입니다.
colossatr0n

2
다른 네트워크의 새 실제 컴퓨터에서이 chromedriver.exe 수정을 사용한 경우에도 작동하지 않았습니다.
Ahmed Memon 2018 년

오류가 발생했습니다.이 버전은이 컴퓨터에서 작동하지 않습니다 :(
Walid Bousseta

@ colossatr0n 당신이 알고있는 감지 할 수없는 오픈 소스 포크가 있습니까?
ishandutta2007 년

3
크롬 드라이버 사람들은이 문제가 해결되지 않을 것이라고 선언 했으므로 무기한으로 포크를 사용하거나 바이너리를 편집해야 할 수도 있습니다. bugs.chromium.org/p/chromedriver/issues/detail?id=3220
Kodiologist

144

기본적으로 셀레늄 감지 기능은 셀레늄으로 실행될 때 나타나는 미리 정의 된 자바 스크립트 변수를 테스트하는 것입니다. 봇 검색 스크립트는 일반적으로 어떤 단어를 포함하는 (창 개체)에 변수의에서 "셀레늄"/ "webdriver", 또한라는 문서 변수 모양 $cdc_$wdc_. 물론,이 모든 것은 사용중인 브라우저에 따라 다릅니다. 모든 다른 브라우저는 다른 것을 노출시킵니다.

나를 위해, 나는, 그래서 크롬을 사용 나는했다는 것을 모두 할 그 보장하는 것이었다 $cdc_문서 변수로 더 이상 존재하지 않고 짜잔 (다운로드 chromedriver 소스 코드 수정 chromedriver 재 컴파일 $cdc_다른 이름.)

이것은 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];
}

(모든 내가 설정 한 주석을 참고 $cdc_randomblabla_.

다음은 봇 네트워크가 사용할 수있는 기술 중 일부를 보여주는 의사 코드입니다.

runBotDetection = function () {
    var documentDetectionKeys = [
        "__webdriver_evaluate",
        "__selenium_evaluate",
        "__webdriver_script_function",
        "__webdriver_script_func",
        "__webdriver_script_fn",
        "__fxdriver_evaluate",
        "__driver_unwrapped",
        "__webdriver_unwrapped",
        "__driver_evaluate",
        "__selenium_unwrapped",
        "__fxdriver_unwrapped",
    ];

    var windowDetectionKeys = [
        "_phantom",
        "__nightmare",
        "_selenium",
        "callPhantom",
        "callSelenium",
        "_Selenium_IDE_Recorder",
    ];

    for (const windowDetectionKey in windowDetectionKeys) {
        const windowDetectionKeyValue = windowDetectionKeys[windowDetectionKey];
        if (window[windowDetectionKeyValue]) {
            return true;
        }
    };
    for (const documentDetectionKey in documentDetectionKeys) {
        const documentDetectionKeyValue = documentDetectionKeys[documentDetectionKey];
        if (window['document'][documentDetectionKeyValue]) {
            return true;
        }
    };

    for (const documentKey in window['document']) {
        if (documentKey.match(/\$[a-z]dc_/) && window['document'][documentKey]['cache_']) {
            return true;
        }
    }

    if (window['external'] && window['external'].toString() && (window['external'].toString()['indexOf']('Sequentum') != -1)) return true;

    if (window['document']['documentElement']['getAttribute']('selenium')) return true;
    if (window['document']['documentElement']['getAttribute']('webdriver')) return true;
    if (window['document']['documentElement']['getAttribute']('driver')) return true;

    return false;
};

사용자 @szx에 따르면 16 진 편집기에서 chromedriver.exe를 열고 실제로 컴파일하지 않고 수동으로 교체를 수행 할 수도 있습니다.


26
예, 문제없이 작동했습니다. 이번 변경 전에 "블랙리스트"에 빠지면 문제를 해결하기가 매우 어렵습니다. 기존 블랙리스트에서 벗어나려면 가짜 캔버스 지문을 구현하고, 플래시를 비활성화하고, IP를 변경하고, 요청 헤더 순서를 변경해야합니다 (언어 교체 및 헤더 수락). 블랙리스트에
빠지면

2
"/ Users / your_username / chromium / src / chrome / test / chromedriver / js"파일을 찾았습니다
JonghoKim

6
나는 단순히 16 진수 편집기에서 로 바꾸었고 효과 $cdcxxxx있었습니다 chromedriver.exe! 또한 미리 정의 된 크기를 사용하지 않고 브라우저 창을 최대화하면 덜 자주 감지됩니다.
szx

2
이것은 Windows, OSX 또는 Linux입니까? osx에서 16 진 편집이 작동하지 않는 것 같습니다.
Nish

5
$ zzz_zzzzzzzzzzzzzzzzzzzzzzzzz_ (동일한 문자 수)로 16 진수로 편집했지만 작동하지 않았습니다.
Aymon Fournier

100

우리가 이미 질문과 게시 된 답변에서 알아 낸 것처럼, 웹 스크래핑 방지 및 "Distil Networks" 라는 봇 탐지 서비스가 여기에 있습니다. 그리고 회사 CEO의 인터뷰 에 따르면 :

새로운 봇을 만들 수는 있지만 Selenium을 사용중인 도구로 식별 할 수있는 방법을 찾아서 해당 봇에서 반복되는 횟수에 관계없이 Selenium을 차단하고 있습니다 . 우리는 지금 파이썬과 많은 다른 기술로 그렇게하고 있습니다. 한 유형의 봇에서 패턴이 등장하면 사용하는 기술을 리버스 엔지니어링하여 악의적 인 것으로 식별합니다.

그들이 어떻게 Selenium을 정확하게 감지하는지 이해하려면 시간과 추가 과제가 필요하지만, 지금 우리가 말할 수있는 것은 무엇입니까?

  • 그것은 셀레늄으로 취한 행동과 관련이 없습니다. 일단 사이트를 탐색하면 즉시 감지되어 금지됩니다. 액션 사이에 인위적인 무작위 지연을 추가하려고했습니다. 페이지가로드 된 후 일시 중지하십시오.
  • 브라우저 지문에 관한 것이 아닙니다. 시크릿 모드가 아닌 깔끔한 프로파일로 여러 브라우저에서 시도해보십시오. 도움이되지 않았습니다.
  • 인터뷰의 힌트에 따르면, 이것은 "역 엔지니어링"이었기 때문에 브라우저에서 일부 JS 코드가 실행되어 셀레늄 웹 드라이버를 통해 자동화 된 브라우저임을 알 수 있습니다.

명확하게 답변으로 게시하기로 결정했습니다.

크롬 드라이버와 함께 셀레늄을 사용할 때 웹 사이트에서 감지 할 수 있습니까?

예.


또한 실험하지 않은 것은 이전 셀레늄 및 이전 브라우저 버전입니다. 이론적으로 Distil Networks 봇 감지기가 현재 의존하고있는 특정 시점에서 셀레늄에 구현 / 추가 된 것이있을 수 있습니다. 그렇다면이 경우 관련 변경이 발생한 지점 / 버전을 감지하고 (검출기를 감지하자) 변경 로그 및 변경 세트를 살펴볼 수 있습니다. 웹 드라이버 기반 브라우저를 탐지하는 데 사용되는 기능은 무엇입니까? 테스트해야 할 이론 일뿐입니다.


@RyanWeinstein 글쎄, 우리는 실제 증거가 없으며 우리는 추측하고 테스트 할 수 있습니다. 지금은 셀레늄을 사용하여 우리를 감지 할 수있는 방법이 있다고 말하고 싶습니다. 셀레늄 버전을 시험해보십시오. 이는 힌트를 줄 수 있습니다.
alecxe

1
임시 포트를 결정하는 방법과 관련이있을 수 있습니까? 이 방법은 잘 알려진 범위에서 멀리 떨어져 있습니다. github.com/SeleniumHQ/selenium/blob/…
Elliott de Launay

9
Easyjet은 distilnetwork 서비스를 사용하고 있습니다. 예. 더미 봇은 차단할 수 있지만 복잡한 봇은 차단할 수는 없습니다. 다른 IP에서 하루에 2000 번 이상의 요청으로 테스트했기 때문에 기본적으로 각 IP는 다음과 같습니다. 하루에 5-10 건의 요청이 있으며이 모든 봇 탐지 서비스가 45 % 작동 알고리즘을 개발하고 판매하기 위해 거기에 있음을 알 수 있습니다. 우리가 사용한 스크레이퍼는 탐지하기 쉬웠으며 destilnetworks, squareshield 및 기타 어느 것도 사용하지 못하도록 강요 할 수 없었습니다.
Jeffery ThaGintoki

3
크롬 웹 드라이버에서 navigator.webdriver를 감지하고 있다고 생각합니다. intoli.com/blog/not-possible-to-block-chrome-headless 의 도움으로 navigator.webdriver = false를 만들려고했습니다.stackoverflow.com/questions/47297877/… . 그것은 로봇이 대신 페이지 감지 반환 distilnetworks.com/distil_identify_cookie.html
hoozecn

24

wellsfargo.com에서 구현되는 예 :

try {
 if (window.document.documentElement.getAttribute("webdriver")) return !+[]
} catch (IDLMrxxel) {}
try {
 if ("_Selenium_IDE_Recorder" in window) return !+""
} catch (KknKsUayS) {}
try {
 if ("__webdriver_script_fn" in document) return !+""

13
마지막 시도는 왜 닫히지 않습니까? 게다가 당신의 대답을 조금 설명해 주시겠습니까?
ishandutta2007 년

16

난독 화 된 JavaScript 결과

크롬 드라이버 소스 코드를 확인했습니다. 브라우저에 일부 자바 스크립트 파일이 삽입됩니다.
이 링크의 모든 자바 스크립트 파일은 https://chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/js/ 웹 페이지에 삽입됩니다.

그래서 리버스 엔지니어링을 사용 하고 16 진수 편집으로 js 파일을 난독 화 했습니다. 이제는 더 이상 자바 스크립트 변수, 함수 이름 및 고정 문자열이 셀레늄 활동을 발견하는 데 사용되지 않았다고 확신했습니다. 그러나 여전히 일부 사이트와 reCaptcha는 셀레늄을 감지합니다!
어쩌면 그들은 chromedriver js 실행으로 인한 수정 사항을 확인합니다 :)


편집 1 :

Chrome '네비게이터'매개 변수 수정

'네비게이터'에 chromedriver를 사용하여 간단히 알아내는 몇 가지 매개 변수가 있음을 발견했습니다. 매개 변수는 다음과 같습니다.

  • "navigator.webdriver" 자동화되지 않은 모드에서는 '정의되지 않음'입니다. 자동 모드에서는 'true'입니다.
  • "navigator.plugins" 헤드리스 크롬의 길이는 0입니다. 플러그인 길이 확인 프로세스를 속이기 위해 가짜 요소를 추가했습니다.
  • " navigator.languages" 는 기본 크롬 값 '[ "en-US", "en", "es"]'로 설정되었습니다.

그래서 내가 필요한 것은 웹 페이지에서 자바 스크립트를 실행하는 크롬 확장 프로그램이었습니다. 기사에 제공된 js 코드 로 확장 을 만들고 다른 기사 를 사용 하여 압축 확장자를 내 프로젝트에 추가했습니다. 값을 성공적으로 변경했습니다. 그러나 여전히 아무것도 바뀌지 않았습니다!

나는 이와 같은 다른 변수를 찾지 못했지만 그것이 존재하지 않는다는 것을 의미하지는 않습니다. 여전히 reCaptcha는 Chromedriver를 감지하므로 더 많은 변수를 변경해야합니다. 다음 단계는 내가 원하는하지 않는 것이 검출기 서비스의 리버스 엔지니어링해야한다.

이제이 자동화 프로세스에 더 많은 시간을 보내거나 다른 방법을 찾아 볼 가치가 없습니다!


12

크롬의 특정 사용자 프로필과 함께 셀레늄을 사용하십시오. 그러면 특정 사용자로 사용하고 원하는 것을 정의 할 수 있습니다. 그렇게하면 '실제'사용자로 실행되며 일부 프로세스 탐색기에서 크롬 프로세스를보고 태그와의 차이점을 볼 수 있습니다.

예를 들면 다음과 같습니다.

username = os.getenv("USERNAME")
userProfile = "C:\\Users\\" + username + "\\AppData\\Local\\Google\\Chrome\\User Data\\Default"
options = webdriver.ChromeOptions()
options.add_argument("user-data-dir={}".format(userProfile))
# add here any tag you want.
options.add_experimental_option("excludeSwitches", ["ignore-certificate-errors", "safebrowsing-disable-download-protection", "safebrowsing-disable-auto-update", "disable-client-side-phishing-detection"])
chromedriver = "C:\Python27\chromedriver\chromedriver.exe"
os.environ["webdriver.chrome.driver"] = chromedriver
browser = webdriver.Chrome(executable_path=chromedriver, chrome_options=options)

크롬 태그 목록은 여기


11

partial interface Navigator { readonly attribute boolean webdriver; };

Navigator 인터페이스의 webdriver IDL 속성은 webdriver-active 플래그의 값을 리턴해야합니다. 초기 값은 false입니다.

이 속성을 통해 웹 사이트는 WebDriver가 사용자 에이전트를 제어하고 있음을 확인하고 서비스 거부 공격을 완화하는 데 사용할 수 있습니다.

2017 W3C Editor의 WebDriver 초안 에서 직접 가져온 것 입니다. 이것은 최소한 셀레늄 드라이버의 향후 반복이 오용을 방지하기 위해 식별 될 수 있음을 의미합니다. 궁극적으로 소스 코드가 없으면 크롬 드라이버를 정확하게 감지 할 수없는 원인을 파악하기가 어렵습니다.


4
물론 소스 코드를 자유롭게 사용할 수 있습니다 .. "그것은 소스 코드없이 얘기하기 어렵다"
코리 골드버그

6
나는 웹 사이트가 문제의 소스 코드가 없다는 것을 의미했습니다. 그들이 무엇을 점검하고 있는지 말하기는 어렵습니다.
브라이스

8

window.navigator.webdriver === true드라이버로 작업하는 경우 Firefox가 설정 되었다고합니다. 그것은 이전 사양 중 하나 (예 : archive.org ) 에 따르면 되었지만 부록에서 매우 모호한 문구를 제외하고 는 새로운 사양 에서 찾을 수 없었습니다 .

그것에 대한 테스트는 fingerprint_test.js 파일의 셀레늄 코드에 있습니다. 여기서 주석은 "현재 Firefox에서만 구현되었습니다"라고하지만 간단한 방향으로 코드를 식별 할 수 grep없었습니다. 현재 (41.0.2) Firefox 릴리스 트리 또는 Chromium 트리.

또한 2015 년 1 월부터 파이어 폭스 드라이버 b82512999938에서 지문 인식과 관련하여 이전 커밋에 대한 의견을 찾았습니다 . 이 코드는 어제 다운로드 된 Selenium GIT-master에 javascript/firefox-driver/extension/content/server.js있으며, 현재 w3c 웹 드라이버 사양에서 약간 다르게 표기된 부록으로 연결되는 주석이 있습니다.


2
방금 Firefox 55로 웹 드라이버를 테스트했으며 이것이 사실이 아님을 확인할 수 있습니다. 변수 window.navigator.webdriver가 정의되지 않았습니다.
speedplane

1
업데이트 : Firefox 65로 테스트 한 결과입니다.window.navigator.webdriver == true
speedplane

Firefox 버전 76은 여전히 ​​그렇습니다.
user2284144

8

@ Erti-Chris Eelmaa 의 훌륭한 답변에 추가하여 성가 시며window.navigator.webdriver 읽기 전용입니다. 값을 변경해도 이벤트 false는 계속 유지 true됩니다. 자동 소프트웨어로 구동되는 브라우저가 여전히 감지되는 이유입니다. MDN

변수는 --enable-automation크롬 의 플래그 로 관리됩니다 . chromedriver 출시는 플래그 크롬과 크롬은 설정 window.navigator.webdrivertrue. 여기에서 찾을 수 있습니다 . 플래그를 "스위치 제외"에 추가해야합니다. 예를 들어 (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

웹 애플리케이션 방화벽 뒤에있는 것 같습니다. modsecurity와 owasp를 살펴보고 그 작동 방식을 확인하십시오. 실제로, 당신이 요구하는 것은 봇 탐지 회피를 수행하는 방법입니다. 그것은 셀레늄 웹 드라이버가 아닙니다. 다른 웹 응용 프로그램과 충돌하지 않는 웹 응용 프로그램을 테스트하기위한 것입니다. 가능하지만 기본적으로 WAF가 규칙 세트에서 무엇을 찾는 지 살펴보고 가능하면 셀레늄으로 피해야합니다. 그래도 사용중인 WAF를 모르기 때문에 여전히 작동하지 않을 수 있습니다. 올바른 첫 번째 단계, 즉 사용자 에이전트를 위조했습니다. 그래도 작동하지 않으면 WAF가 있고 더 까다로워 야 할 수도 있습니다.

편집 : 다른 답변에서 가져온 점. 사용자 에이전트가 실제로 올바르게 설정되어 있는지 확인하십시오. 로컬 웹 서버에 부딪 히거나 트래픽이 유출 될 수 있습니다.


나는 당신이 올바른 길을 가고 있다고 생각합니다. 설정을 테스트하고 사용자 에이전트를 유효한 사용자 에이전트 문자열로 바꾸어 동일한 결과를 얻었으며 stubhub가 요청을 차단했습니다.
Brian Cain

1
이 주제는 매우 방대합니다. 이해하지 못하고 이해하고 싶다면 여기가 올바른 장소가 아닙니다. owasp로 시작하십시오. 침투 테스트 및 웹 보안을 살펴보십시오. 또한 앞에서 말한 것처럼이 주제에 대해 modsecurity와 WAF를 살펴보십시오.
Bassel Samman

1
HTTP 헤더 문제인 경우 일반 브라우저가 차단되지 않습니까? HTTP 헤더는 정확히 동일합니다. 또한 github 링크로 정확히 무엇을보고 있습니까? stubhub를 진행하기 위해 셀레늄을 사용해 보셨습니까? 뭔가 매우 벗어났습니다.
Ryan Weinstein

1
혼란을 드려 죄송합니다. 나는 그것을 조사 할 것이고 당신이 원하지 않는다면 더 이상 나를 도울 필요가 없습니다. 내 경험의 대부분은 프로그래밍 시스템 응용 프로그램에 관한 것이기 때문에 나는 당신이 말하는 이러한 모드 보안 규칙에 익숙하지 않았습니다. 한 번 살펴보고 교육하려고 노력하겠습니다. 나는 아무것도 우회하려고하지 않고,이 웹 사이트가 셀레늄을 사용하는 사용자를 어떻게 감지하는지 알고 싶었습니다.
라이언 와인 스타 인

1
나도 개발자입니다 :). 학습은 내가 뒤처 질 수있는 원인이다. 도움이 필요하지 않습니다. 귀하의 의도를 알지 못하고 웹 사이트 보안을 우회하는 데 도움이되지 않았 음을 분명히 밝히고 싶었습니다. 당신의 질문에 대답하기 위해, 그들이 감지하는 것은 셀레늄이 아닙니다. 이 규칙은 의심스러운 행동을 감지하고 문제를 일으키는 고객에 대해 적절한 조치를 취하기로 결정했습니다. 그들은 당신이하고있는 것보다 더 많이하지 않는 것에 의해 당신을 붙잡습니다. 되찾기 링크, 당신은 아이디어 base_rules / modsecurity_crs_20_protocol_violations.conf 얻기 위해이 파일을 체크 아웃 할 수 있습니다
Bassel Samman

6

모든 올바른 데이터를 전송하더라도 (예 : Selenium이 확장으로 표시되지 않는 경우 적절한 해상도 / 비트 심도, & c), 방문자 행동을 프로파일 링하여 액터는 사용자 또는 자동화 된 시스템입니다.

예를 들어, 사이트를 방문한 후 마우스를 1 초 이내에 관련 버튼으로 직접 움직여 어떤 동작을 수행하려고하는 것은 사용자가 실제로하지 않는 일입니다.

https://panopticlick.eff.org/ 와 같은 사이트를 사용 하여 브라우저의 고유성을 확인하는 디버깅 도구로 유용 할 수도 있습니다 . 또한 Selenium에서 실행 중임을 나타내는 특정 매개 변수가 있는지 확인하는 데 도움이됩니다.


3
이미 해당 웹 사이트를 사용했으며 지문이 일반 브라우저와 동일합니다. 또한 나는 아무것도 자동화하지 않습니다. 평소와 같이 탐색 중입니다.
Ryan Weinstein

6

내가 본 봇 감지는 아래 답변에서 읽은 것보다 더 정교하거나 적어도 다르게 보입니다.

실험 1 :

  1. Python 콘솔에서 Selenium으로 브라우저와 웹 페이지를 엽니 다.
  2. 마우스는 이미 페이지가로드되면 링크가 표시되는 특정 위치에 있습니다. 마우스를 움직이지 않습니다.
  3. 마우스 왼쪽 버튼을 한 번 누릅니다 (Python이 브라우저에서 실행중인 콘솔에서 포커스를 가져와야 함).
  4. 마우스 왼쪽 버튼을 다시 누릅니다 (커서가 지정된 링크 위에 있음을 기억하십시오).
  5. 링크는 정상적으로 열립니다.

실험 2 :

  1. 이전과 마찬가지로 Python 콘솔에서 Selenium으로 브라우저와 웹 페이지를 엽니 다.

  2. 이번에는 마우스로 클릭하는 대신 Selenium (Python 콘솔에서)을 사용하여 임의의 오프셋으로 동일한 요소를 클릭합니다.

  3. 링크가 열리지 않지만 가입 페이지로 이동합니다.

결과 :

  • 셀레늄을 통해 웹 브라우저를 열면 사람이 등장하는 것을 막을 수 없습니다
  • 사람처럼 마우스를 움직일 필요는 없습니다.
  • 오프셋으로 Selenium을 통해 무언가를 클릭하면 여전히 알람이 발생합니다.

신비한 것처럼 보이지만 액션이 Selenium에서 시작되었는지 여부를 결정할 수는 있지만 브라우저 자체가 Selenium을 통해 열렸는지 여부는 신경 쓰지 않습니다. 아니면 창에 초점이 있는지 확인할 수 있습니까? 누군가 통찰력이 있으면 들리는 것이 흥미로울 것입니다.


3
내 생각에 셀레늄은 자바 스크립트를 통해 페이지에 무언가를 주입하여 요소를 찾고 액세스한다고 생각합니다. 이 주사는 그들이 감지하고 있다고 생각합니다.
zeusalmighty

맞습니다.이 테스트는 100 % 유효합니다. 나는 동일한 결과로 비슷한 테스트를 수행했습니다. Enter 탭을 보내거나 키를 보낼 수 있습니다. 요소에 액세스하는 순간 페이지 작동이 중지되었습니다. 따라서 드라이버가 브라우저에 자바 스크립트를 삽입하면. 크롬 확장을 사용하여 해당 자바 스크립트를 암호화하고 다음 확장에서 동일한 확장을 사용하여 해독 할 수 있습니다. 나는 다음날 그것을 보려고 노력할 것입니다.
trixo

6

내가 찾은 또 다른 것은 일부 웹 사이트가 사용자 에이전트를 확인하는 플랫폼을 사용한다는 것입니다. 값에 "HeadlessChrome"이 포함되어 있으면 헤드리스 모드를 사용할 때 동작이 이상 할 수 있습니다.

이에 대한 해결 방법은 사용자 에이전트 값을 대체하는 것입니다 (예 : Java).

chromeOptions.addArguments("--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36");

5

일부 사이트에서이를 감지하고 있습니다.

function d() {
try {
    if (window.document.$cdc_asdjflasutopfhvcZLmcfl_.cache_)
        return !0
} catch (e) {}

try {
    //if (window.document.documentElement.getAttribute(decodeURIComponent("%77%65%62%64%72%69%76%65%72")))
    if (window.document.documentElement.getAttribute("webdriver"))
        return !0
} catch (e) {}

try {
    //if (decodeURIComponent("%5F%53%65%6C%65%6E%69%75%6D%5F%49%44%45%5F%52%65%63%6F%72%64%65%72") in window)
    if ("_Selenium_IDE_Recorder" in window)
        return !0
} catch (e) {}

try {
    //if (decodeURIComponent("%5F%5F%77%65%62%64%72%69%76%65%72%5F%73%63%72%69%70%74%5F%66%6E") in document)
    if ("__webdriver_script_fn" in document)
        return !0
} catch (e) {}

Chrome 및 Firefox, 셀레늄 3.5.0, ChromeDriver 2.31.488774, geckodriver 0.18.0
jerrypy

4

다음 코드로 html 페이지를 작성하십시오. DOM 셀레늄에서 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
이 속성은 Firefox에서만 추가됩니다.
Louis

1
그리고 브라우저를 제어하는 ​​셀레늄 확장에서이를 제거 할 수 있습니다. 어쨌든 작동합니다.
m3nda 2016 년

3

Javascript "key"변수를 다음과 같이 변경하는 것을 발견했습니다.

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

많은 사이트가 Selenium에 의해 폐기되는 것을 피하기 위해이 변수를 확인하기 때문에 Chrome과 함께 Selenium Webdriver를 사용할 때 일부 웹 사이트에서 작동합니다.


2

Selenium을 사용하는 가장 간단한 방법은 브라우저 지문을 다시 보내는 XHR을 가로 채는 것입니다.

그러나 이것은 Selenium 전용 문제이므로 다른 것을 사용하는 것이 좋습니다. 셀레늄은 이와 같은 것을 더 어렵게 만드는 것이 아니라 더 쉬운 것으로 만들어야합니다.


셀레늄에 대한 다른 옵션은 무엇입니까?
Tai

필자는 요청이 주요 파이썬 옵션 일 것이라고 생각합니다. 브라우저가 전송하는 것과 동일한 요청을 보내면 일반 브라우저로 나타납니다.
pguardiario

2

"자동화 가능"매개 변수를 사용하려고 할 수 있습니다.

var options = new ChromeOptions();

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

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

그러나이 기능은 ChromeDriver 79.0.3945.16 에서 수정되었음을 경고하고 싶습니다. . 따라서 이전 버전의 크롬을 사용해야합니다.

또한 다른 옵션으로 Chrome 대신 InternetExplorerDriver를 사용해 볼 수 있습니다. 나를 위해, IE는 해킹없이 전혀 차단하지 않습니다.

자세한 내용은 여기를 살펴보십시오.

셀레늄 웹 드라이버 : 셀레늄 감지를 방지하기 위해 navigator.webdriver 플래그 수정

Chrome v76에서 "자동 소프트웨어로 Chrome을 제어하고 있습니다"정보 표시 줄을 숨길 수 없음

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.