В дискуссии под названием Как recaptcha 3 узнает, что я использую селен / хромедрайвер , мы обсудили некоторые общие подходы, чтобы избежать обнаружения при просмотре веб-страниц.Давайте углубимся в глубину.
Безголовый браузер
Безголовый браузер - это браузер, который можно использовать без графического интерфейса.Он может управляться программно для автоматизации задач, таких как выполнение тестов или создание снимков экрана с веб-страницами.
Зачем обнаруживать безголовый браузер?
Согласно @ AntoineVastel ,Безголовые браузеры используются для автоматизации вредоносных задач.Наиболее распространенные случаи - это просмотр веб-страниц, увеличение количества показов рекламы или поиск уязвимостей на веб-сайте.
Еще год назад одним из самых популярных безголовых браузеров был PhantomJS.Поскольку он построен на платформе Qt, он имеет много отличий по сравнению с большинством популярных браузеров.Было возможно обнаружить PhantomJS, используя некоторые методы снятия отпечатков в браузере.Начиная с версии 59, Google выпустила безголовую версию своего браузера Chrome.В отличие от PhantomJS, он основан на ванильном Chrome, а не на внешней структуре, что делает его присутствие более трудным для обнаружения.Таким образом, существуют и другие способы обнаружения Chrome без головы.
Определение Chrome без головы
Пользовательский агент : атрибут пользовательского агента обычноиспользуется для определения ОС, а также браузера пользователя.В Chrome версии 59 он имеет следующее значение:
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/59.0.3071.115 Safari/537.36
Плагины : navigator.plugins
возвращает массив плагинов, присутствующих в браузере.Как правило, в Chrome мы находим плагины по умолчанию, такие как Chrome PDF viewer
или Google Native Client
.Напротив, в режиме без заголовка возвращаемый массив содержит плагин no .
Языки : В Chrome два атрибута Javascript позволяют получать языки, используемые user: navigator.language
и navigator.languages
.Первый - это язык пользовательского интерфейса браузера, а второй - массив строк, представляющих предпочтительные языки пользователя.Однако в режиме без головы navigator.languages
возвращает пустую строку.
WebGL : WebGL - это API для выполнения 3D-рендеринга на холсте HTML.С помощью этого API можно запросить информацию о поставщике графического драйвера, а также о представителе графического драйвера.С ванильным Chrome и Linux мы можем получить следующие значения для рендерера и поставщика: Google SwiftShader
и Google Inc.
.В безголовом режиме мы можем получить Mesa OffScreen
, которая является технологией, используемой для рендеринга без использования какой-либо оконной системы, и Brian Paul
, которая является программой, которая начала открыватьИсходная графическая библиотека Mesa.
Проверка на наличие WebGL может быть выполнена с помощью:
var canvas = document.createElement('canvas');
var gl = canvas.getContext('webgl');
var debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
var vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);
var renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
if(vendor == "Brian Paul" && renderer == "Mesa OffScreen") {
console.log("Chrome headless detected");
}
Не все Chrome без заголовка будут иметь одинаковые значения для вендора и рендерера.Другие сохраняют значения, которые также могут быть найдены в безголовой версии.Однако Mesa Offscreen
и Brian Paul
указывают на наличие версии без головки.
Функции браузера : библиотека Modernizr позволяет проверить, присутствует ли в браузере широкий спектр функций HTML и CSS.Единственное различие, которое мы обнаружили между Chrome и Chrome без головы, заключалось в том, что у последнего не было функции линии роста волос, которая обнаруживает поддержку hidpi/retina hairlines
.
Пропущенное изображение : последнее в нашем списке также представляется наиболее надежным из-за размера изображения, используемого Chrome в случае, если изображение не может быть загружено. В случае ванильного Chrome изображение имеет ширину и высоту, которые зависят от масштаба браузера, но отличаются от нуля. В Chrome без головы изображение имеет ширину и высоту, равные нулю.
Проверка на наличие Отсутствующего изображения может быть выполнена через:
var body = document.getElementsByTagName("body")[0];
var image = document.createElement("img");
image.src = "http://iloveponeydotcom32188.jg";
image.setAttribute("id", "fakeimage");
body.appendChild(image);
image.onerror = function(){
if(image.width == 0 && image.height == 0) {
console.log("Chrome headless detected");
}
}
Вот некоторые из важнейших факторов, по которым безголовые браузеры более подвержены обнаружению.
Outro