Фингерпринтинг языка браузера — техника отслеживания, считывающая navigator.languages — свойство JavaScript, раскрывающее полный упорядоченный список языковых предпочтений — для построения постоянного идентификатора браузера без хранения чего-либо на устройстве. Посмотрите, что именно раскрывает ваш браузер прямо сейчас на whatsmy.fyi.
TL;DR
Каждый браузер раскрывает ранжированный список языковых предпочтений через navigator.languages. Трекеры считывают этот массив — вместе с часовым поясом, IP-геолокацией и размером экрана — для уточнения отпечатка браузера. Сам по себе языковой сигнал имеет низкую энтропию. В сочетании с десятком других сигналов он становится надёжной проверкой согласованности, подтверждающей, что один и тот же пользователь находится за одним устройством на разных сайтах и сессиях — даже после очистки cookies.
Что такое фингерпринтинг языка браузера?
Фингерпринтинг языка браузера — один из компонентов более широкого инструментария fingerprinting браузера. Он эксплуатирует два тесно связанных браузерных API: navigator.languages (упорядоченный массив языковых кодов) и navigator.language (одно основное предпочтение). Оба доступны любому JavaScript, выполняющемуся на странице, без взаимодействия пользователя и без каких-либо разрешений.
Языковые данные ценны для трекеров не потому, что они сами по себе высоко уникальны — большинство русскоязычных пользователей сообщают ["ru", "ru-RU"]. Они выполняют две функции: добавляют к энтропии отпечатка, когда комбинация необычна, и служат сигналом согласованности, который сверяется с HTTP-заголовком Accept-Language, IP-геолокацией и системным часовым поясом. Любое несоответствие между этими уровнями само по себе является сигналом отслеживания — маркирующим пользователей VPN, эмуляторы браузеров и инструменты приватности.
Инструмент Cover Your Tracks от Electronic Frontier Foundation тестирует раскрытие языка как один из более чем 30 сигналов в отпечатке браузера и неизменно находит его читаемым во всех основных браузерах.
Как работает navigator.languages?
navigator.languages возвращает массив только для чтения из языковых тегов BCP 47, упорядоченных от наиболее предпочтительного к наименее предпочтительному. Каждый тег имеет формат язык-РЕГИОН — например ru-RU, en-US или zh-CN. Первый элемент всегда равен значению navigator.language.
Массив заполняется из языковых настроек браузера, которые обычно отражают настроенный список языков операционной системы. В Chrome, Firefox и Яндекс Браузере пользователи могут настроить несколько языков в настройках браузера; полученный порядок отражается точно в navigator.languages. Тот же список отправляется в виде HTTP-заголовка Accept-Language с каждой загрузкой страницы.
// Считывание языковых предпочтений — доступно любому скрипту сайта
console.log(navigator.language);
// → "ru-RU"
console.log(navigator.languages);
// → ["ru-RU", "ru", "en-US", "en"]
// Каждое языковое предпочтение перечислено в порядке приоритета.
// Двуязычный пользователь, добавивший английский как запасной,
// значительно более идентифицируем, чем монолингвальный.
// Браузер отправляет те же предпочтения в каждом HTTP-запросе:
// Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
// Скрипт fingerprinting комбинирует это с другими сигналами:
function getLanguageFingerprint() {
return {
language: navigator.language,
languages: navigator.languages,
// Перекрёстная проверка: совпадает ли язык с часовым поясом?
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
// Перекрёстная проверка: совпадает ли язык с системной локалью?
locale: Intl.DateTimeFormat().resolvedOptions().locale,
};
}
// Вывод для двуязычного пользователя: высокая энтропия
// Вывод для типичного ru-RU монолингвального: низкая энтропия,
// но всё равно полезен для проверки согласованностиnavigator.language vs navigator.languages
Два свойства связаны, но не идентичны, и трекеры считывают оба:
| Свойство | Тип возврата | Пример значения | Роль в fingerprinting |
|---|---|---|---|
navigator.language | Строка | "ru-RU" | Низкая энтропия; совпадает у большинства в регионе |
navigator.languages | Массив строк | ["ru-RU", "en", "de"] | Более высокая энтропия; необычные комбинации более узнаваемы |
Заголовок Accept-Language | Строка HTTP-заголовка | ru-RU,ru;q=0.9,en;q=0.8 | Отправляется с каждым запросом; вектор серверного fingerprinting |
Локаль из API Intl | Строка | "ru-RU" | Перекрёстная проверка с массивом языков на согласованность |
Насколько уникален языковой фингерпринт?
Языковое предпочтение само по себе — один из сигналов с более низкой энтропией в инструментарии fingerprinting. Его сила — в комбинации и проверке согласованности. Таблица ниже показывает его вклад в контексте сигналов с более высокой энтропией:
| Сигнал | Примерная энтропия | Источник |
|---|---|---|
| Строка User Agent | 10–15 бит | EFF Cover Your Tracks |
| Рендеринг Canvas | 8–12 бит | Исследования EFF / BrowserLeaks |
| Рендерер WebGL | 6–10 бит | Академические исследования fingerprinting |
| Системный часовой пояс | 3–4 бита | EFF Panopticlick, 2010 |
| Массив языков (монолингвальный) | <1 бита | EFF / анализ 404privacy.com |
| Массив языков (многоязычный, необычная комбинация) | 3–6 бит | Академические полевые исследования |
| Полный отпечаток (30+ сигналов в сочетании) | 18+ бит (1 из 287 000) | Оригинальное исследование EFF Panopticlick |
Исследование EFF Panopticlick 2010 года — проанализировавшее более 500 000 отпечатков браузеров — установило, что 84% браузеров были полностью уникальными. Языковое предпочтение было одним из измеренных сигналов; его вклад значительно возрастал для браузеров с неанглийскими или многоязычными конфигурациями. Примечательно, что исследование выявило: языковой fingerprinting имеет непропорциональное воздействие — пользователи языков меньшинств имеют более высокие показатели уникальности и, следовательно, большую уязвимость для отслеживания.
Кто использует языковой fingerprinting в реальной жизни?
Рекламные сети и кросс-сайтовые трекеры
Рекламные платформы объединяют navigator.languages с десятками других сигналов при построении идентификатора устройства. Языковые данные особенно ценны как сигнал согласованности — если IP-геолокация пользователя указывает на Россию, а его языковой массив содержит ["en-US", "en"], это несоответствие предполагает использование VPN или прокси, что само по себе влияет на решения о таргетинге рекламы.
Платформы обнаружения мошенничества и ботов
Сервисы вроде Fingerprint.com включают языковое предпочтение в свои системы умных сигналов как часть профиля интеллекта устройства. Если попытка входа приходит с устройства, чей языковой массив отличается от записанного для этого аккаунта, это вызывает сигнал риска. Инструменты автоматизации браузеров часто сообщают необычные или стандартные языковые значения, которые системы обнаружения мошенничества используют для маркировки ботовой активности.
Системы обнаружения обхода геоблокировки
Медиасайты и стриминговые сервисы комбинируют IP-регион с navigator.languages для обнаружения пользователей, обходящих географические ограничения. Пользователь, маршрутизирующий трафик через выходной узел в США, но чей браузер сообщает ["ru", "ru-RU"], создаёт явное несоответствие, приводящее к принудительному применению географических ограничений.
Законно ли это?
По GDPR данные о языковых предпочтениях вносят вклад в отпечаток браузера, квалифицирующийся как персональные данные, когда они могут быть разумно связаны с конкретным человеком. Французский регулятор CNIL явно потребовал информированного согласия на fingerprinting в рекламных целях, с узким исключением для законных интересов в области предотвращения мошенничества. По российскому Федеральному закону № 152-ФЗ «О персональных данных» составные идентификаторы устройств могут квалифицироваться как персональные данные и требовать согласия субъекта.
Руководство W3C Fingerprinting Guidance специально идентифицирует navigator.languages как поверхность fingerprinting и рекомендует производителям браузеров ограничить его раскрытие. Это руководство повлияло на поведение Safari, Brave и приватного режима Firefox.
Как защититься от языкового fingerprinting?
- Brave Browser (рекомендуется для ежедневного использования): Brave реализует защиту от языкового fingerprinting по умолчанию. В стандартном режиме сообщает только основное языковое предпочтение, а не полный массив. В строгом режиме всегда сообщает
"en-US"независимо от реальных настроек, помещая в наибольший возможный анонимный набор. Защита распространяется на заголовокAccept-Language, обеспечивая согласованность на уровнях HTTP и JavaScript. - Firefox с
privacy.resistFingerprinting: Включение этого флага вabout:configзаставляет Firefox сообщать только["en-US", "en"]независимо от настроенных языков, максимизируя анонимный набор. - Tor Browser (наиболее сильная защита): Tor Browser сообщает единую языковую конфигурацию, идентичную для всех пользователей Tor — делая индивидуальное языковое отслеживание невозможным. Компромисс — более медленный браузинг и некоторые проблемы совместимости сайтов.
- Уменьшите языковой список: Если вы добавили несколько языков в настройки браузера, рассмотрите удаление менее используемых. Необычная комбинация вроде
["ru-RU", "en-US", "de", "ja"]значительно более отличительна, чем["ru-RU"]. - VPN ограничения: VPN меняет вашу IP-геолокацию, но не влияет на то, что сообщает
navigator.languages. Фактически VPN может ухудшить согласованность отпечатка: если ваш IP указывает на одну страну, а языковой массив — на другую, это несоответствие само по себе является отличительным сигналом. Проверьте работу VPN на whatsmy.fyi.
Часто задаваемые вопросы
Работает ли языковой fingerprinting в режиме инкогнито?
Да. Приватный режим не меняет языковые настройки браузера. navigator.languages возвращает те же значения в окне инкогнито, что и в обычном. Chrome в режиме инкогнито сообщает фактический настроенный языковой список без изменений. Только браузеры с активной защитой от fingerprinting — Brave, Firefox с privacy.resistFingerprinting или Tor Browser — ведут себя иначе.
В чём разница между navigator.language и navigator.languages?
navigator.language возвращает одну строку — основное языковое предпочтение. navigator.languages возвращает упорядоченный массив всех настроенных языковых предпочтений — от наиболее к наименее предпочтительному. Первый элемент navigator.languages всегда равен navigator.language. Трекеры считывают полный массив, поскольку он содержит больше энтропии.
Может ли VPN предотвратить языковой fingerprinting?
Нет. VPN маршрутизирует трафик через другой сервер для изменения видимого IP-адреса, но не влияет на то, что JavaScript считывает из языковых настроек браузера. navigator.languages заполняется из конфигурации браузера и операционной системы, а не из сетевого пути. Фактически VPN может ухудшить согласованность отпечатка: если ваш IP предполагает одну страну, а языковой массив — другую, это несоответствие само является отличительным сигналом.
Одинаковы ли заголовок Accept-Language и navigator.languages?
Они используют одни и те же исходные данные. Заголовок Accept-Language строится из языковых предпочтений и отправляется с каждым HTTP-запросом до выполнения JavaScript — серверные системы fingerprinting могут читать его без запуска скриптов. navigator.languages раскрывает те же предпочтения через JavaScript. Трекеры перекрёстно проверяют оба, чтобы обнаружить несоответствия, указывающие на подделку. Защита Brave охватывает как HTTP-заголовок, так и JavaScript API, обеспечивая их согласованность.
Связанные статьи
- Что такое отпечаток браузера? Как сайты отслеживают вас без cookies — полное руководство по всем сигналам отпечатков
- Что такое Canvas Fingerprinting? Как сайты отслеживают без cookies — как HTML5 Canvas API рисует скрытое изображение, уникально идентифицирующее GPU
- Аудио Fingerprinting: AudioContext отслеживает браузер — как аудиостек устройства создаёт уникальный идентификатор
- Do Not Track не работает — вот почему слежку не остановить — аналогичный парадокс конфиденциальности с заголовком DNT



