Я настоятельно рекомендую вам прочитать обе статьи ниже и применить все эти методы к вашему коду, чтобы еще больше усложнить обнаружение Chrome Headless.
Новые методы обнаружения Chrome без заголовка
невозможно обнаружить и заблокировать Chrome без головы
Детекторы безголового браузера обычно используют множество методов, чтобы определить, управляется ли ваш браузер удаленно, например, некоторые свойства среды браузера:
Пользовательский агент (старый)
Это атрибут, обычно используемый для определения ОС, а также браузера пользователя. На компьютере Linux с Chrome версии 63 он имеет следующее значение: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/63.0.3071.115 Safari/537.36
Таким образом, мы можем проверить наличие Chrome Headless:
if (/HeadlessChrome/.test(window.navigator.userAgent)) {
console.log('Chrome headless detected!')
}
Вебдрайвер (новый)
Для автоматизации Chrome headless в объект навигатора добавлено новое свойство webdriver (см. код Chromium). Таким образом, проверяя наличие свойства, можно обнаружить Chrome без заголовка.
if (navigator.webdriver) {
console.log('Chrome headless detected!')
}
Хром (новый)
window.chrome
— это объект, который, кажется, предоставляет функции разработчикам расширений Chrome. Хотя он доступен в ванильном режиме, он недоступен в безголовом режиме.
if (!window.chrome) {
console.log('Chrome headless detected')
}
Разрешения (новое)
В настоящее время невозможно обрабатывать разрешения в автономном режиме. Таким образом, это приводит к несогласованному состоянию, когда Notification.permission и navigator.permissions.query сообщают о противоречивых значениях.
const permissionStatus = await navigator.permissions.query({ name: 'notifications' })
if (Notification.permission === 'denied' && permissionStatus.state === 'prompt') {
console.log('This is Chrome headless!')
} else {
console.log('This is not Chrome headless')
}
Плагины (старые)
navigator.plugins
возвращает массив плагинов, присутствующих в браузере. Как правило, в Chrome мы находим плагины по умолчанию, такие как Chrome PDF Viewer или Google Native Client. Наоборот, в безголовом режиме возвращаемый массив не содержит плагина.
if (navigator.plugins.length === 0) {
console.log('Chrome headless detected!')
}
Языки (старые)
В Chrome два атрибута Javascript позволяют получить языки, используемые пользователем: navigator.language и navigator.languages. Первый — это язык пользовательского интерфейса браузера, а второй — массив строк, представляющих предпочитаемые пользователем языки. Однако в автономном режиме navigator.languages возвращает пустую строку.
if (navigator.languages === '') {
console.log('Chrome headless detected')
}
WebGL
WebGL — это API для выполнения 3D-рендеринга на холсте HTML. С помощью этого API можно запросить поставщика графического драйвера, а также средство визуализации графического драйвера.
С ванильным Chrome и Linux я получаю следующие значения для рендерера и поставщика: «Google SwiftShader» и «Google Inc.». В безголовом режиме я получаю «Mesa OffScreen», технологию, используемую для рендеринга без использования какой-либо оконной системы, и «Brian Paul», программу, которая запустила графическую библиотеку Mesa с открытым исходным кодом.
const canvas = document.createElement('canvas')
const gl = canvas.getContext('webgl')
const debugInfo = gl.getExtension('WEBGL_debug_renderer_info')
const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL)
const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL)
if (vendor == 'Brian Paul' && renderer == 'Mesa OffScreen') {
console.log('Chrome headless detected')
}
Отсутствует изображение
Наконец, наш последний вывод, который также кажется наиболее надежным, связан с размером изображения, используемого Chrome в случае, если изображение не может быть загружено.
В случае ванильного Chrome ширина и высота изображения зависят от масштаба браузера, но отличны от нуля. В безголовом Chrome изображение имеет ширину и высоту, равные нулю.
const img = document.createElement('img')
img.src = "http://iloveponeydotcom32188.jg"
document.body.appendChild(img)
img.onerror = () => {
if (img.width == 0 && img.height == 0) {
console.log('Chrome headless detected')
}
}
person
henriquehbr
schedule
30.11.2019