Современные веб-сайты могут собирать широкий спектр информации о пользователе. Например, после того как вы искали товар онлайн, связанная реклама может «преследовать» вас повсюду — и всё из-за того, что сайты учитывают такие параметры, как разрешение экрана, часовой пояс и даже набор смайликов. Причем даже режим инкогнито не гарантирует анонимности: имея за плечами хороший стек, можно написать скрипт, который может незаметно собрать отпечаток устройства, и если хотя бы одна из характеристик отпечатка уникальна, устройство можно идентифицировать без использования куки. 

В этой статье я хочу погрузиться чуть глубже в ту сферу, существование которой я старательно не замечал и игнорировал, на заре своей карьеры в этих ваших интернетах. Рассмотрим, что такое отпечаток браузера, как он формируется на практике, какие данные содержит и какими приёмами можно противодействовать его сбору.

Основные источники данных для отпечатка браузера

Пассивные признаки (HTTP). При каждом HTTP-запросе браузер передаёт серверу заголовки, которые сами по себе несут информацию об устройстве. В логах доступа обычно фиксируются: User-Agent, IP-адрес, Referer, список поддерживаемых форматов и т.д. Эти данные формируются автоматически и уже дают сайту представление о системе пользователя. По данным EFF Panopticlick, в список таких параметров входят строка User-Agent, HTTP Accept, разрешение экрана, часовой пояс и информация о плагинах/шрифтах. Эти атрибуты сервер сразу включает в модель отпечатка браузера. Например, сервер уже знает – что вы используете - ПК или смартфон, какую ОС, язык системы и базовые настройки браузера, это в принципе и ложится в будущий уникальный идентификатор.

Активные признаки (JavaScript и Web API). Помимо заголовков, для отпечатка используется JS-код на странице. Скрипты могут прочитать множества дополнительных параметров: языковые настройки (navigator.language), таймзону (new Date().getTimezoneOffset()), аппаратные характеристики (navigator.hardwareConcurrency, navigator.deviceMemory), список установленных плагинов (navigator.plugins) и системных шрифтов (например, измерением текста через Canvas). К современным методам относят получение информации из WebGL (поле UNMASKED_VENDOR_WEBGL/UNMASKED_RENDERER_WEBGL для GPU), генерацию canvas-отпечатка (рендеринг изображений и текста, захват данных через canvas.toDataURL()), использование WebAudio (особенности рендеринга звука). Также могут учитываться настройки сенсоров, шаблоны работы таймера и многое другое. Все эти активные данные вместе с пассивными параметрами объединяются в один «отпечаток» – часто просто длинную строку или вектор значений. Затем применяется хеширование (обычно быстрый непредназначенный для криптозащиты алгоритм, например MurmurHash), чтобы получить компактный цифровой идентификатор посетителя.

Пример отпечатка

На рисунке показан пример отпечатка браузера (Tor Browser на Linux). Видно, что собраны стандартные атрибуты: User-Agent (здесь Firefox/67.0 на Fedora), Content-Language (en-US), Часовой пояс (GMT+2, указано Timezone -120), разрешение экрана (1920×1080×24) и прочие. Отдельно указаны WebGL-параметры: «Vendor: Intel Open Source Technology Center» и «Renderer: Mesa DRI Intel(R) UHD Graphics 620 (Kabylake)». Зелёным цветом отображён canvas-отпечаток – текст «Cwm fjordbank glyphs vext quiz», полученный при рендеринге с помощью Canvas API. Все эти данные собираются без участия пользователя. Затем они объединяются (например, через join в массиве) и хешируются. В простейшем случае получается такой алгоритм (псевдокод):

var components = [
  navigator.userAgent,
  navigator.language,
  screen.colorDepth,
  screen.width + 'x' + screen.height,
  new Date().getTimezoneOffset(),
  // ... другие атрибуты ...
];
var fingerprintHash = murmurhash3(components.join('||'));
console.log('Browser fingerprint:', fingerprintHash);

В этом примере используется MurmurHash3 – быстрый 32-битный хеш. Библиотека FingerprintJS, например, под капотом собирает около 20–30 подобных свойств и вычисляет из них visitorId. В результате получается цифровой отпечаток – число или строка, достаточно устойчивая во времени, чтобы идентифицировать браузер при повторном посещении.

Уникальность отпечатка браузера и статистика

Как показали эксперименты, большинство отпечатков действительно уникальны. В исследовании, в котором участвовало около 500к браузеров 84% конфигураций оказались уникальными, а среди браузеров с Flash/Java доля уникальных повышалась до 94%. Это означает, что практически у каждого пользователя набор атрибутов отличается от всех остальных. Позднее проведённые исследования подтверждают высокий уровень идентификации: стремящийся к 99.24% точности при распознавании пользователя по отпечатку, где изменение одного параметра снижало точность лишь на 0.3%. Иными словами, для большинства людей отпечаток почти столь же уникален, как настоящий отпечаток пальца.

При этом необходимо учитывать, что браузеры постепенно внедряют механизмы «усреднения» отпечатков. Например, Tor Browser принудительно нормализует значения (использует единую версию User-Agent, одни шрифты по умолчанию и т.п.), чтобы все пользователи выглядели одинаково. Аналогично действует режим «сопротивления отпечаткам» в Firefox. Тем не менее, это не даёт 100% гарантии: если в вашем отпечатке есть хотя бы одна характеристика (или сочетание признаков), которое ни у кого больше нет, вас всё равно можно отследить.

Библиотеки и инструменты для отпечатков браузера

Существует несколько известных решений для генерации отпечатков. EFF запустила проект Panopticlick (позже Cover Your Tracks), который собирал анонимные данные о конфигурациях браузеров и демонстрировал пользователям их уникальность. На его основе работает сайт AmIUnique (запущен в 2014 году), куда любой желающий может зайти и увидеть свой текущий отпечаток. К 2019 году AmIUnique собрал статистику более чем по миллиону посетителей, что дало глубокое понимание природы отпечатков браузера (fingerprinting).

Для разработчиков есть готовые библиотеки. Самой известной является FingerprintJS (версии V4+), открытая библиотека на JavaScript. Она запрашивает множество свойств браузера и вычисляет из них уникальный идентификатор посетителя. Прежняя версия fingerprintjs2 уже устарела, но идеи похожи – собрать navigator.userAgent, список navigator.plugins, размеры экрана, Canvas-рендеринг и т.д., а затем объединить в одну строку и прогнать через MurmurHash (как показано выше). 

Также используются специализированные сервисы антифрода. Они часто тоже собирают отпечаток браузера, но применяют машинное обучение на стороне сервера. Например, платформа Sift предлагает Device Fingerprinting API: где каждому устройству присваивается уникальный ID и хранится история его активности. Если в дальнейшем этот ID замечен в мошеннических операциях, система помечает его как подозрительный. LexisNexis ThreatMetrix, Iovation и другие крупные решения работают по схожему принципу: накопление огромной «базы знаний» о устройствах и их поведении. Благодаря этому можно сравнивать отпечатки между собой и определять аномалии.

Применение отпечатков браузера

Трекинг и таргетинг - отпечаток браузера в рекламе

Отпечатки широко применяются в рекламных сетях и аналитике. К примеру, есть исследование, о том, как изменение отпечатка влияет на рекламу. В нем (исследовании) эмулировали поведение пользователя, меняли его fingerprint и смотрели на данные аукционов рекламы и HTTP-трафик. Результат: существенные изменения в ставках рекламы и заметное снижение объёма синхронизированных HTTP-запросов при смене отпечатка. Это, как минимум, доказывает, что рекламные системы действительно учитывают fingerprint при продаже рекламы (и многие из них могут обходить ограничения GDPR/CCPA, продолжая слежку даже без куки), а как максимум, что ставками можно манипулировать.

В целом, отпечаток позволяет сайту узнавать вернувшихся пользователей без куки. Так, рекламные сети могут связывать поведение разных визитов по цифровому «отпечатку» и настраивать более точный таргетинг. Подобная технология сейчас считается частью рекламы без кук (cookieless advertising), когда браузеры блокируют трекинг на основе куки.

Безопасность и антифрод - отпечаток браузера на страже вашей приватности

Отпечатки приносят пользу и в задачах безопасности. Их используют при двухфакторной аутентификации и борьбе с ботами. Так, отпечатки ботов заметно отличаются от обычных. Следовательно, сайт может тестировать отпечаток клиента, а если он «не выглядит как обычный», повысить уровень проверки (дать более сложную капчу). Многие коммерческие антибот-системы реализуют именно такой подход: например, Sift не только определяет историю устройства, но и анализирует, изменялся ли его отпечаток (сильные изменения могут говорить о попытке скрыть реальный отпечаток). Также отпечаток может служить «смягчающим фактором» при подозрении на фрод: если у пользователя история профиля на конкретном устройстве не имеет никаких подозрительных операций, сайт может понизить требования к такому пользователю в вопросах авторизации, не требовать повторную верификацию.

Приватность и антидетект

С другой стороны, сам пользователь или разработчик браузера может стремиться усложнить сбор отпечатка. Наиболее известный пример - Tor Browser – все пользователи должны «выглядеть одинаково» в глаза сайтов. Tor маскирует свою ОС под Windows, задаёт единый набор шрифтов и размеров окна для всех, а по умолчанию блокирует несколько API (Canvas, WebGL) для снижения вариативности. Также Tor ограничивает точность встроенных таймеров, чтобы предотвратить тонкие измерения производительности железа. Более того, Tor предупреждает пользователя: «Расширение Tor Browser может позволить веб-сайтам определить размер вашего монитора, что может быть использовано для отслеживания вас. Мы рекомендуем оставлять окно Tor Browser в исходном размере по умолчанию.». Это пример «человеческого» требования – размер экрана является частью отпечатка, а при расширении окна вы рискуете стать единственным пользователем с таким разрешением.

Браузер Brave предлагает специальный режим, где многие значения упрощаются или подменяются. Расширения вроде CanvasBlocker заменяют canvas-данные на случайные или пустые. Библиотека Privacy Badger (EFF) может отключать скрипты известных трекеров. Поэтому новые веб-API проектируются с учётом конфиденциальности (ограниченные client hints, CORS-политики и т.д.).

Способы обхода и защиты от отпечатков браузера

Полностью предотвратить сбор отпечатков сложно, но существуют практики смягчения. Первая мера – минимизация данных: по возможности ограничивать или рандомизировать выдачу значений. Например, можно динамически менять часовой пояс/язык при каждом визите (хотя это даст возможность легко вычислить подделку). В браузерах реализуют единую среду (хороший пример - Tor), все пользователи выходят с одинаковым списком шрифтов и расширений. Другой подход – блокировка скриптов и API. Отключение (или блокировка) Canvas/WebGL/Audio API делает модель отпечатка беднее, но и усложняет её создание. Например, код на сайте не сможет отрисовать тестовую картинку для Canvas, и вы получите однотипные или пустые данные, не дающие уникального сигнала.

// Пример детектирования антидетект-браузера на JavaScript (по [27]):
if (os === 'macOS' && browser === 'Chrome' && version > 88) {
    // В чистом Chrome на macOS должны быть определены эти API:
    if (!('BarcodeDetector' in window) && !('share' in navigator) && !('canShare' in navigator)) {
        console.log('Обнаружен Hidemium (антидетект-браузер)');
    }
}

Этот пример проверяет наличие API, которые должны быть в обычном Chrome (BarcodeDetector, navigator.share/canShare и др.). Если их нет, вероятно, запущен антидетект-браузер (он удалил или изменил эти методы).

Наконец, на стороне сервера можно применять сглаживание и анализ метаданных. Если отпечаток пользователя меняется необычно часто (например, разные Fingerprint ID в рамках одной учётной записи), это может сигнализировать о попытке обхода. Системы мониторят такие паттерны и адаптируют риск-модели.

Заключение

Отпечатки браузера – это сложный инструмент, сочетающий в себе множество технических приёмов. С одной стороны, он позволяет веб-сервисам узнавать пользователей без куки (в рекламе, аналитике, борьбе с фродом), а с другой – может угрожать приватности. Важно понимать, что по мере развития веба добавляются новые способы подсветить устройство (например, новые Web API), поэтому и методы защиты эволюционируют.

Комментарии (0)