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

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



답변

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, 다른 네트워크 또는 자신이있는 것을 사용하여 탐지 한 사이트에 액세스해야 할 수도 있습니다.


답변

기본적으로 셀레늄 감지 기능은 셀레늄으로 실행될 때 나타나는 미리 정의 된 자바 스크립트 변수를 테스트하는 것입니다. 봇 검색 스크립트는 일반적으로 어떤 단어를 포함하는 (창 개체)에 변수의에서 “셀레늄”/ “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를 열고 실제로 컴파일하지 않고 수동으로 교체를 수행 할 수도 있습니다.


답변

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

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

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

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

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

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

예.


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


답변

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 !+""


답변

난독 화 된 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를 감지하므로 더 많은 변수를 변경해야합니다. 다음 단계는 내가 원하는하지 않는 것이 검출기 서비스의 리버스 엔지니어링해야한다.

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


답변

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

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

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)

크롬 태그 목록은 여기


답변

partial interface Navigator {
readonly attribute boolean webdriver;
};

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

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

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