Фингерпринтинг Navigator: утечки браузера
Как navigator.platform, hardwareConcurrency и deviceMemory раскрывают вашу идентичность и как обеспечить согласованные свойства navigator.
Нужна поддерживаемая продуктовая документация?
У этой статьи есть соответствующая страница в центре документации. Используйте docs для каноничного сценария настройки, актуальных флагов и долгосрочной справки.
Введение
Объект navigator в JavaScript является одним из наиболее доступных источников информации об устройстве для любого веб-сайта. Свойства вроде navigator.platform, navigator.hardwareConcurrency, navigator.deviceMemory, navigator.userAgent и navigator.languages раскрывают детали о вашей операционной системе, CPU, ОЗУ и конфигурации браузера. По отдельности каждое свойство имеет ограниченную идентифицирующую способность. В совокупности они формируют составной отпечаток, который существенно сужает популяцию пользователей. В отличие от экспериментальных API, которые могут требовать разрешений, свойства navigator универсально доступны, широко поддерживаются и запрашиваются практически каждым скриптом отслеживания в сети. В этой статье объясняется, как свойства navigator способствуют снятию отпечатков и как BotBrowser обеспечивает согласованные, управляемые профилем значения для каждого свойства.
Влияние на конфиденциальность
Свойства navigator являются фундаментальным слоем снятия отпечатков браузера. Каждый скрипт отслеживания начинает с navigator, потому что данные бесплатны, не требуют разрешений и доступны мгновенно.
Исследование 2020 года Университета Айовы проанализировало более 100 000 отпечатков браузера и обнаружило, что комбинация navigator.userAgent, navigator.platform, navigator.hardwareConcurrency, navigator.deviceMemory и navigator.languages предоставляла в среднем 12,8 бит идентифицирующей информации. Для справки, 12,8 бит могут различить примерно 7000 уникальных конфигураций. Добавьте разрешение экрана и часовой пояс, и комбинация обычно уникально идентифицирует более 90% пользователей.
Группа W3C по вопросам конфиденциальности подробно задокументировала последствия свойств navigator для конфиденциальности. Их руководство по снятию отпечатков перечисляет hardwareConcurrency, deviceMemory и languages как "высокоэнтропийные" поверхности, которые существенно способствуют межсайтовому отслеживанию. Несмотря на это, эти свойства остаются доступными без ограничений во всех основных браузерах, потому что слишком много легитимных веб-приложений зависят от них.
Корпоративные среды и среды разработки подвержены дополнительному риску. Нестандартные значения, такие как 64-ядерный hardwareConcurrency (серверное тестирование), 0,25 ГБ deviceMemory (встроенные устройства) или необычные языковые комбинации, немедленно выделяются в любой популяции.
Техническая основа
Объект navigator содержит десятки свойств. Вот наиболее значимые для снятия отпечатков:
Основные свойства идентичности
navigator.userAgent- Строка пользовательского агента. Содержит имя браузера, версию, имя ОС и версию ОС. Несмотря на попытки устаревания, остается наиболее запрашиваемым свойством.navigator.platform- Возвращает строку, идентифицирующую платформу: "Win32", "MacIntel", "Linux x86_64", "Linux armv81" и т.д.navigator.vendor- Возвращает вендора браузера. "Google Inc." для Chrome/Chromium-браузеров, "" для Firefox, "Apple Computer, Inc." для Safari.
Аппаратные свойства
navigator.hardwareConcurrency- Возвращает количество логических ядер CPU. Типичные значения от 2 до 16 для потребительских устройств. Значения выше 16 или ниже 4 существенно сужают популяцию.navigator.deviceMemory- Возвращает приблизительный объем ОЗУ в ГБ. Возможные значения: 0.25, 0.5, 1, 2, 4 и 8 (ограничено 8). Этот API доступен только в браузерах на базе Chromium.
Свойства локали и языка
navigator.language- Возвращает предпочтительный язык (например, "en-US").navigator.languages- Возвращает массив предпочтительных языков в порядке приоритета (например, ["en-US", "en", "fr"]).
Свойства соединения и медиа
navigator.connection- Network Information API, раскрывающийeffectiveType,downlink,rttиsaveData. Эти значения отражают сетевые условия, но достаточно стабильны для участия в снятии отпечатков.navigator.mediaDevices- Перечисление медиаустройств раскрывает количество и типы камер, микрофонов и аудиовыходов.
User Agent Client Hints
Современные Chromium-браузеры также предоставляют navigator.userAgentData, обеспечивающий структурированный доступ к бренду браузера, платформе и статусу мобильности. Метод высокой энтропии getHighEntropyValues() возвращает детальную информацию о версии платформы, архитектуре, разрядности и модели устройства.
Почему эти значения варьируются
Значения свойств navigator зависят от:
- Операционной системы. Строки платформы, языки по умолчанию и доступные API памяти различаются по ОС.
- Оборудования. Количество ядер CPU и объем памяти зависят от оборудования.
- Версии браузера. Строки пользовательского агента меняются с каждым релизом. Бренды и версии Client Hints эволюционируют.
- Настроек пользователя. Языковые предпочтения и настройки локали контролируются пользователем.
Распределение этих значений неравномерно. Несколько конфигураций (8-ядерный Windows 10 с 8 ГБ ОЗУ, язык en-US) очень распространены. Все остальное прогрессивно реже и более идентифицируемо.
Распространенные подходы к защите и их ограничения
Подмена пользовательского агента является старейшим и наиболее распространенным подходом. Расширения или настройки браузера изменяют navigator.userAgent на другую строку. Проблема: большинство инструментов подмены изменяют только строку UA без корректировки других коррелированных свойств. Заявление о macOS через пользовательский агент, в то время как navigator.platform показывает "Win32", является очевидным несоответствием.
VPN не влияют на свойства navigator. Эти значения определяются браузером и ОС, а не сетью.
Режим инкогнито/приватный режим не изменяет свойства navigator. Ваш отпечаток идентичен в обычном и приватном режиме просмотра.
Расширения браузера, модифицирующие свойства navigator, работают в JavaScript и сами могут быть обнаружены по отпечаткам. Наличие модифицированных геттеров у свойств navigator обнаруживается через проверку цепочки прототипов и анализ тайминга.
Рандомизация свойств navigator создает нереалистичные комбинации. Устройство с 3 ядрами CPU, 3 ГБ памяти и строкой платформы "Win64" не соответствует никакому реальному оборудованию. Такие комбинации более уникальны и идентифицируемы, чем честные значения.
Фундаментальная проблема - согласованность. Свойства navigator должны формировать когерентный набор, соответствующий реальной конфигурации устройства. Платформа должна соответствовать пользовательскому агенту. Количество ядер должно быть реалистичным для заявленного оборудования. Память должна соответствовать платформе. Языки должны быть правдоподобны для заявленной локали.
Подход BotBrowser на уровне движка
BotBrowser настраивает все свойства navigator через свою систему профилей на уровне движка. Когда загружается профиль, каждое свойство объекта navigator возвращает значения, полученные от профилированного устройства.
Полный охват свойств
Профили BotBrowser определяют значения для всех релевантных свойств navigator:
userAgent,appVersion,platform,vendorиappCodeNameсогласованы с профилированным браузером и ОС.hardwareConcurrencyсоответствует конфигурации CPU профилированного устройства.deviceMemoryсоответствует уровню ОЗУ профилированного устройства.languageиlanguagesсоответствуют профилированной локали.userAgentData(бренды, платформа, флаг мобильности, fullVersionList) генерируется для соответствия профилированному бренду и версии браузера.
Внутренняя согласованность
Критическое преимущество подхода BotBrowser в том, что все свойства выводятся из единого когерентного профиля. Нет сценария, где platform показывает "MacIntel", а userAgent содержит "Windows NT 10.0". Профиль определяет идентичность устройства, и все свойства navigator отражают её.
Это распространяется на User Agent Client Hints. Когда сайт вызывает navigator.userAgentData.getHighEntropyValues(), возвращаемые значения платформы, platformVersion, архитектуры, разрядности, модели и fullVersionList соответствуют профилю. Заголовки HTTP Sec-CH-UA-* соответствуют значениям JavaScript.
Контроль сетевой информации
С флагом --bot-network-info-override BotBrowser также контролирует значения navigator.connection (rtt, downlink, effectiveType, saveData) и соответствующие заголовки Client Hints. Это обеспечивает выравнивание связанных с сетью свойств navigator с профилем.
Согласованность в Workers
Свойства navigator также доступны в Web Workers и Service Workers. BotBrowser обеспечивает возврат тех же значений во всех контекстах выполнения, включая dedicated workers, shared workers и service workers. Нет разрыва, где worker возвращает ваши реальные аппаратные значения, а главный поток - значения профиля.
Настройка и использование
Базовая загрузка профиля
chrome --bot-profile="/path/to/profile.enc" \
--user-data-dir="$(mktemp -d)"
Все свойства navigator настраиваются автоматически из профиля.
Переопределение языка и локали
# Автоопределение по IP (по умолчанию)
chrome --bot-profile="/path/to/profile.enc" \
--bot-config-languages=auto \
--bot-config-locale=auto
# Ручное переопределение
chrome --bot-profile="/path/to/profile.enc" \
--bot-config-languages="fr-FR,fr,en" \
--bot-config-locale="fr-FR"
Переопределение сетевой информации
chrome --bot-profile="/path/to/profile.enc" \
--bot-network-info-override
Интеграция с Playwright
const { chromium } = require('playwright');
const browser = await chromium.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
'--bot-profile=/path/to/profile.enc',
'--bot-config-languages=auto',
'--bot-config-locale=auto',
'--bot-config-timezone=auto'
]
});
const page = await browser.newPage();
await page.goto('https://example.com');
// Проверка свойств navigator
const platform = await page.evaluate(() => navigator.platform);
const cores = await page.evaluate(() => navigator.hardwareConcurrency);
console.log(`Platform: ${platform}, Cores: ${cores}`);
Интеграция с Puppeteer
const puppeteer = require('puppeteer');
const browser = await puppeteer.launch({
executablePath: '/path/to/botbrowser/chrome',
defaultViewport: null,
args: [
'--bot-profile=/path/to/profile.enc',
'--bot-network-info-override'
]
});
const page = await browser.newPage();
await page.goto('https://example.com');
Проверка
Проверка согласованности свойств. Запросите все свойства navigator и убедитесь, что они формируют когерентный набор. Платформа должна соответствовать ОС пользовательского агента. Количество ядер должно быть реалистичным для платформы. Память должна быть правдоподобной.
Проверка Client Hints. Используйте navigator.userAgentData.getHighEntropyValues(['platform', 'platformVersion', 'architecture', 'bitness', 'model', 'fullVersionList']) и подтвердите, что значения соответствуют профилю. Проверьте, что заголовки HTTP-запросов Sec-CH-UA-* соответствуют значениям JavaScript.
Согласованность в Workers. Запустите те же запросы свойств navigator в Web Worker и сравните результаты с главным потоком. Они должны быть идентичны.
Стабильность между сессиями. Запросите свойства navigator в нескольких сессиях с одним профилем. Все значения должны быть идентичны.
Лучшие практики
- Всегда загружайте профиль. Без
--bot-profileсвойства navigator отражают вашу реальную систему. Профиль обеспечивает контролируемые значения. - Используйте автоопределение для сигналов локали.
--bot-config-timezone=auto,--bot-config-locale=autoи--bot-config-languages=autoвыводят локаль из IP вашего прокси, сохраняя согласованность языковых свойств navigator с вашим видимым местоположением. - Не переопределяйте отдельные свойства вручную. Профиль обеспечивает внутреннюю согласованность. Переопределение одного свойства (например, hardwareConcurrency) без корректировки коррелированных значений создает несоответствия.
- Следите за изменениями формата пользовательского агента. Строки пользовательского агента браузера меняются с каждой версией. Используйте актуальные профили из репозитория профилей BotBrowser.
- Тестируйте и в главном потоке, и в Workers. Проверяйте согласованность navigator во всех контекстах выполнения.
Часто задаваемые вопросы
В: Действительно ли navigator.hardwareConcurrency помогает идентифицировать пользователей? О: Да. Хотя распространенные значения (4, 8) разделяются многими пользователями, необычные значения (1, 2, 6, 24, 64) высоко идентифицируемы. В сочетании с другими свойствами navigator даже распространенные значения вносят вклад в общий отпечаток.
В: Что происходит с navigator.deviceMemory в Firefox или Safari? О: deviceMemory - API только для Chromium. Firefox и Safari не раскрывают его. Профили BotBrowser для Chrome/Edge/Brave включают значения deviceMemory. Если профиль нацелен на браузер, не поддерживающий этот API, он не раскрывается.
В: Могут ли веб-сайты определить, что свойства navigator были модифицированы? О: Плохо реализованные модификации (JavaScript-переопределения) могут быть обнаружены через инспекцию прототипов и анализ тайминга. Контроль BotBrowser на уровне движка модифицирует свойства у источника, поэтому нет JavaScript-видимых артефактов.
В: Обрабатывает ли BotBrowser изменения User-Agent reduction (UA-CH)?
О: Да. BotBrowser генерирует корректные заголовки User Agent Client Hints (Sec-CH-UA-*) и значения navigator.userAgentData, соответствующие профилю. Сокращенная строка пользовательского агента и высокоэнтропийные подсказки согласованы.
В: Как BotBrowser обрабатывает navigator.webdriver?
О: BotBrowser контролирует свойство navigator.webdriver через свою систему профилей, обеспечивая возврат ожидаемого значения для контекста просмотра.
В: Влияет ли флаг --bot-noise-seed на свойства navigator? О: Свойства navigator являются детерминированными значениями (количество ядер, память, платформа), которые не включают шум. Они поступают непосредственно из профиля. Шумовое зерно влияет на выходные данные рендеринга (canvas, WebGL, аудио), а не на свойства аппаратной идентичности.
Итоги
Свойства navigator формируют фундаментальный слой снятия отпечатков браузера. Они универсально доступны, не требуют разрешений и предоставляют значительную идентифицирующую информацию при комбинировании. BotBrowser контролирует все свойства navigator на уровне движка через свою систему профилей, обеспечивая внутреннюю согласованность пользовательского агента, платформы, оборудования, локали и API Client Hints. В сочетании с автоопределением часового пояса, локали и языка BotBrowser создает когерентную идентичность браузера, соответствующую реальной конфигурации устройства.
По связанным темам см. Что такое снятие отпечатков браузера, Контроль количества ядер CPU, Защита экрана и окна и Часовой пояс, локаль и язык.
Похожие статьи
Переведите BotBrowser из исследований в продакшн
Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.