• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Статья Методы обхода защиты от автоматизированного ПО в браузере Chrome под управлением Selenium в Python

При парсинге данных возникают ситуации, когда нужно получить доступ к сайту с помощью драйвера selenium. Так как на странице сайта в коде выполняются скрипты, которые добавляют в код данные, доступ к которым с помощью обычных запросов получить просто не получиться. Но, все может быть немного печальнее. К примеру, страница может находиться за CDN, такой как Cloudflare, с включенной проверкой браузера. В этом случае обычный драйвер selenium доступ к странице не получит, так как будет определено, что используется автоматизированное тестовое ПО. Но, даже в этих случаях выход есть. Давайте посмотрим, как можно обойти данную проверку с помощью отключения определенных опций в браузере, а также рассмотрим уже модифицированную версию драйвера для Chrome, в которой уже из коробки отключены данные опции. Но, обо всем по порядку.

prew.jpg

Для начала, чтобы убедиться, что доступа к сайту у браузера под управлением Chrome все же нет, создадим простой код, который будет загружать драйвер и переходить на защищенную страницу.


Что потребуется?

Для данного кода потребуется установить selenium. Для этого пишем в терминале команду:

pip install selenium


Загрузка сайта с включенными опциями автоматизации

После того, как будет установлена нужная библиотека, импортируем в скрипт нужные модули. А понадобится нам модуль os, для получения пути к драйверу; time, для того, чтобы установить небольшую паузу перед закрытием; platform, для определения операционной системы, чтобы в зависимости от этого подгружать нужный драйвер.

Из библиотеки selenium импортируем webdriver, а также из selenium.webdriver.chrome.service — Service, для передачи драйверу нужных параметров. В частности, в данном коде передается путь к вебдрайверу, а также параметр log_path, в котором можно указать путь для сохранения логов. В данном случае логи сохраняются в null.

Python:
import os
import time
from platform import system

from selenium import webdriver
from selenium.webdriver.chrome.service import Service


exec_path = os.path.join(os.getcwd(), 'driver', 'chromedriver.exe') if system() == "Windows" else \
    os.path.join(os.getcwd(), 'driver', 'chromedriver')

driver = webdriver.Chrome(service=Service(log_path=os.devnull, executable_path=exec_path))

Ну и перейдем на нужную страницу, подождем 10 секунд и закроем браузер.

Python:
driver.get('https://nowsecure.nl')
time.sleep(10)
driver.close()
driver.quit()

Страница, на которую переходит браузер, как раз находится под защитой Cloudflare. Доступ получить к сайту не получилось. Нам было предложено подтвердить, что мы люди. То есть, браузер проверку не прошел и было определено автоматизированное ПО.

01.png

Python:
import os
import time
from platform import system

from selenium import webdriver
from selenium.webdriver.chrome.service import Service


exec_path = os.path.join(os.getcwd(), 'driver', 'chromedriver.exe') if system() == "Windows" else \
    os.path.join(os.getcwd(), 'driver', 'chromedriver')

driver = webdriver.Chrome(service=Service(log_path=os.devnull, executable_path=exec_path))

driver.get('https://nowsecure.nl')
time.sleep(10)
driver.close()
driver.quit()


Использование selenium-stealth для попытки обхода защиты

Некоторое время назад данный проект выручал во многих случаях. Но в данном случае все не так хорошо и радужно. Попробуем получить доступ к сайту с его помощью.


Что потребуется?

Установить selenium, а также надстройку selenium-stealth, которая и предназначена для скрытия следов автоматизации. Для их установки пишем в терминале команду:

pip install selenium selenium-stealth

Теперь проделаем те же операции, которые мы выполняли при использовании обычного драйвера. С одним небольшим отличием. Здесь в скрипт нужно будет импортировать установленный selenium-stealth, к также из selenium.webdriver.chrome.options импортировать Options, для того, чтобы иметь возможность передавать в браузер различные опции, такие как «безголовость» и прочие. В нашем случае, передать нужно будет опции для отключения автоматизации. Но, давайте по порядку. Импортируем библиотеки в скрипт.

Python:
import os
import time
from platform import system

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium_stealth import stealth

Создаем экземпляр класса Options и передаем туда необходимые параметры.

Python:
options = Options()
# options.add_argument("--headless")
options.add_argument("start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)

После этого создаем объект класса браузера, куда передаем путь к драйверу и установленные нами опции.

Python:
exec_path = os.path.join(os.getcwd(), 'driver', 'chromedriver.exe') if system() == "Windows" else \
    os.path.join(os.getcwd(), 'driver', 'chromedriver')

driver = webdriver.Chrome(options=options, service=Service(log_path=os.devnull, executable_path=exec_path))

Теперь выполняем функцию из модуля selenium_stealth, которая устанавливает заголовки, язык отображения и прочие параметры.

Python:
stealth(driver=driver,
        user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                   'Chrome/83.0.4103.53 Safari/537.36',
        languages=["ru-RU", "ru"],
        vendor="Google Inc.",
        platform="Win32",
        webgl_vendor="Intel Inc.",
        renderer="Intel Iris OpenGL Engine",
        fix_hairline=True,
        run_on_insecure_origins=True,
        )

Ну, а дальше снова попытаемся получить доступ к станице за Cloudflare.

Python:
driver.get('https://nowsecure.nl')
time.sleep(20)
driver.close()
driver.quit()

И снова неудача. К сожалению, стелс модуль с данной задачей не справился, что отображено на скриншоте ниже. Браузер все также определяется под управлением автоматизированного ПО.

02.png

Python:
import os
import time
from platform import system

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium_stealth import stealth

options = Options()
# options.add_argument("--headless")
options.add_argument("start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)

exec_path = os.path.join(os.getcwd(), 'driver', 'chromedriver.exe') if system() == "Windows" else \
    os.path.join(os.getcwd(), 'driver', 'chromedriver')

driver = webdriver.Chrome(options=options, service=Service(log_path=os.devnull, executable_path=exec_path))

stealth(driver=driver,
        user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                   'Chrome/83.0.4103.53 Safari/537.36',
        languages=["ru-RU", "ru"],
        vendor="Google Inc.",
        platform="Win32",
        webgl_vendor="Intel Inc.",
        renderer="Intel Iris OpenGL Engine",
        fix_hairline=True,
        run_on_insecure_origins=True,
        )

driver.get('https://nowsecure.nl')
time.sleep(20)
driver.close()
driver.quit()


Отключение опций с помощью выполнения скрипта в драйвере

Данный способ был представлен на канале Python Today, за что ему большое спасибо. Для того, чтобы обойти защиту проверки браузера на использование автоматизированного ПО, необходимо отключить некоторые опции, которые присутствуют в браузере под управлением Selenium, а вот в оригинальном браузере вы их не найдете.

Вот эти самые опции. Посмотреть их довольно просто. Для этого запускаем браузер под управлением вебдрайвера, нажимаем «F12», чтобы попасть в инструменты разработчика. Затем переходим в консоль и пишем: window.cdc. И тут вы увидите параметры, которые считываются защитой от автоматизированного ПО.

Python:
window.cdc_adoQpoasnfa76pfcZLmcfl_Array
window.cdc_adoQpoasnfa76pfcZLmcfl_Promise
window.cdc_adoQpoasnfa76pfcZLmcfl_Symbol

06.png

К примеру, при запуске обычного браузера и попытке найти там то же самое, ничего найдено не было.

07.png

Теперь пора переходить к практике.

Что потребуется?

Кроме того, что установить selenium, сторонних библиотек в данном коде больше устанавливать не нужно. Пишем в терминале для его установки:

pip install selenium

Теперь импортируем нужные библиотеки в скрипт.

Python:
import os
import time
from platform import system

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service

Как видите, здесь также импортируется класс Options, а значит, мы будем передавать в браузер параметры. В данном случае передадим параметр для отключения автоматизации. Однако, на всякий случай на канале представлены еще два дополнительных параметра, которые можно отключить при необходимости.

Python:
options = Options()
# options.add_argument("--headless")
# options.add_experimental_option("excludeSwitches", ["enable-automation"])
# options.add_experimental_option('useAutomationExtension', False)
options.add_argument("--disable-blink-features=AutomationControlled")

Указываем путь к драйверу и передаем опции и путь в объект браузера.

Python:
exec_path = os.path.join(os.getcwd(), 'driver', 'chromedriver.exe') if system() == "Windows" else \
    os.path.join(os.getcwd(), 'driver', 'chromedriver')

driver = webdriver.Chrome(options=options, service=Service(log_path=os.devnull, executable_path=exec_path))

Теперь необходимо выполнить скрипт для удаления параметров, о которых мы говорили выше из текущего сеанса. Для этого выполняем скрипт:

Python:
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    'source': '''
        delete window.cdc_adoQpoasnfa76pfcZLmcfl_Array;
        delete window.cdc_adoQpoasnfa76pfcZLmcfl_Promise;
        delete window.cdc_adoQpoasnfa76pfcZLmcfl_Symbol;
  '''
})

После этого, пытаемся зайти на защищенную станицу.

Python:
driver.get('https://nowsecure.nl')
time.sleep(10)
driver.close()
driver.quit()

И, все получается. Отключение опции и удаление методов window в данном случае помогло. Доступ к странице мы получили.

03.png

Как видим, метод рабочий и его можно брать на вооружение при парсинге вот таких вот, защищенных сайтов.

Python:
import os
import time
from platform import system

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service

options = Options()
# options.add_argument("--headless")
# options.add_experimental_option("excludeSwitches", ["enable-automation"])
# options.add_experimental_option('useAutomationExtension', False)
options.add_argument("--disable-blink-features=AutomationControlled")

exec_path = os.path.join(os.getcwd(), 'driver', 'chromedriver.exe') if system() == "Windows" else \
    os.path.join(os.getcwd(), 'driver', 'chromedriver')

driver = webdriver.Chrome(options=options, service=Service(log_path=os.devnull, executable_path=exec_path))

driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    'source': '''
        delete window.cdc_adoQpoasnfa76pfcZLmcfl_Array;
        delete window.cdc_adoQpoasnfa76pfcZLmcfl_Promise;
        delete window.cdc_adoQpoasnfa76pfcZLmcfl_Symbol;
  '''
})

driver.get('https://nowsecure.nl')
time.sleep(10)
driver.close()
driver.quit()


Получение доступа с помощью undetected-chromedriver

Ну и еще один метод, который использует в разы меньше кода. На этот раз мы будет пытаться получить доступ к защищенному сайту с помощью библиотеки undetected-chromedriver. Разработчик данной библиотеки пошел дальше и создал библиотеку которая уже подгружает нужный драйвер и тут же его модифицирует с установкой определенных профилей. Более того, если у вас уже установлен selenium, можно указать версию вебдрайвера, и она также будет модифицирована в undetected. Для установки библиотеки пишем в терминале:

pip install undetected-chromedriver

И на этом — все. Больше ничего устанавливать не нужно. Драйвер selenium, как я уже писал выше будет подтянут автоматически.
Теперь, когда библиотека установлена, импортируем в скрипт все, что необходимо для его работы.

Python:
import time

import undetected_chromedriver as uc

Вот и все. Как видите, только библиотека и time, только лишь для того, чтобы установить паузу до закрытия браузера.
При использовании данной библиотеки указывать путь к вебдрайверу нет необходимости, он будет найден автоматически. Все, что требуется в этом случае, это создать объект вебдрайвера.

Python:
driver = uc.Chrome()

И после этого перейдем на защищенный сайт. Кстати, сайт который мы использовали в течении всей данной статьи был сделан разработчиком библиотеки специально для того, чтобы тестировать защиту. Как он пишет, на нем включено все, что только можно включить.

Python:
driver.get('https://nowsecure.nl')
time.sleep(10)
driver.close()
driver.quit()

Как показано ниже, на скриншоте, доступ к сайту был получен успешно.

04.png

Ну и так как используется драйвер selenium, его можно также импортировать в скрипт и выполнять с его помощью все те операции поиска и кликов, которые вы делали в обычном selenium.

Python:
import time

import undetected_chromedriver as uc

driver = uc.Chrome()

driver.get('https://nowsecure.nl')
time.sleep(10)
driver.close()
driver.quit()

Такой вот получился небольшой обзор. Как видите, использование тех или иных методов позволяет получить доступ даже к сайта с защитой от автоматизированного ПО. И по крайней мере, два метода здесь являются рабочими. Какой из них использовать — решать вам, это уже дело предпочтений. Но я использую undetected-chromedriver, который при том же результате, что в коде с Python Today позволяет использовать меньше кода.

А на этом, пожалуй, все.

Спасибо за внимание. Надеюсь, данная информация будет вам полезна
 

Вложения

  • code_selenium.zip
    2,1 КБ · Просмотры: 336
Последнее редактирование модератором:

Kracker

Member
04.05.2018
15
0
BIT
0
первый вариант к сожалению уже не пашет после 114 хрома. Я вчера парсил еще сайтец нужный сегодня уже не пускает, со вторым вариантом норм.
 

Капуста

New member
07.11.2020
2
0
BIT
0
После 25.07.2023г, примерно, вечером, после ужина, перестало работать.
Вообще ничего не проходит защиту.
До ужина даже на одном ip в многопотоке всё работало, а синхронный код вообще отлично отрабатывал.
А теперь нет.
Ищу решение уже третий день.
 

ArturT

New member
18.09.2023
1
0
BIT
0
После 25.07.2023г, примерно, вечером, после ужина, перестало работать.
Вообще ничего не проходит защиту.
До ужина даже на одном ip в многопотоке всё работало, а синхронный код вообще отлично отрабатывал.
А теперь нет.
Ищу решение уже третий день.
Приветствую! Нашлось ли какое-то решение?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!