Фингерпринтинг по шрифтам опознаёт вас по набору установленных шрифтов. Как работают перечисление и измерение шрифтов — и как уменьшить то, что вы раскрываете.
Фингерпринтинг по шрифтам опознаёт ваше устройство по набору установленных на нём шрифтов. Конкретное сочетание ваших шрифтов — сформированное операционной системой, установленным ПО, языковыми пакетами и дизайнерскими инструментами — на удивление отличительно, и сайт может определить это сочетание из JavaScript без какого-либо специального разрешения. Эта статья объясняет, как работают перечисление и измерение шрифтов, почему результат настолько идентифицирует и как уменьшить то, что вы выдаёте.
Ключевые выводы
- Беспермиссионного API, перечисляющего ваши шрифты, не существует; трекеры выводят их, отрисовывая текст и измеряя, как браузер подставляет запасной шрифт, когда запрошенного шрифта нет.
- Несколько сотен проверок «присутствует/отсутствует» складываются в профиль с высокой энтропией, потому что наборы шрифтов отражают вашу ОС, установленные приложения и языковые пакеты.
- Техника не требует разрешения и переживает очистку cookie или приватный режим, поскольку выводится из поведения отрисовки, а не из сохранённых данных.
- Новый API
queryLocalFonts()может перечислить реальные шрифты, но закрыт явным запросом разрешения, поэтому это не тот тихий вектор, на который полагаются трекеры. - Лучшая защита — единообразие: браузеры вроде Tor Browser стандартизируют видимый набор шрифтов, чтобы все выглядели одинаково, вместо добавления собственных шрифтов.
Что такое фингерпринтинг по шрифтам?
Фингерпринтинг по шрифтам — это практика определения того, какие шрифты установлены в вашей системе, и использования этого списка как части идентификатора устройства. О своём наборе шрифтов вы редко задумываетесь, но он несёт реальную энтропию: стандартная установка Windows, Mac с приложениями Adobe и Linux-машина с инструментами разработчика несут заметно разные коллекции шрифтов.
Сайты не могут просто спросить «какие у вас шрифты?» — прямого API, возвращающего полный список, не существует. Вместо этого они выводят его, проверяя конкретные шрифты и наблюдая за тем, как отрисовывается текст. Как и canvas и аудио-фингерпринтинг, он опирается на измеримые различия отрисовки, а не на сохранённые данные, поэтому переживает очистку cookie. Инструменты для исследования приватности, такие как Cover Your Tracks от EFF, демонстрируют, насколько отличительны эти пассивные сигналы в сочетании друг с другом.
Как работает определение шрифтов
Классическая техника — это измерение запасного варианта. Когда браузера просят отрисовать текст шрифтом, который не установлен, он молча подставляет шрифт по умолчанию — а у подставленного почти всегда другие размеры букв. Измеряя эти размеры, скрипт может понять, присутствовал ли запрошенный шрифт на самом деле.
Метод работает так:
- Измерить базовую линию. Отрисовать тестовую строку известными родовыми шрифтами (
monospace,sans-serif,serif) и записать точную ширину и высоту. - Запросить шрифт-кандидат. Отрисовать ту же строку, запрашивая конкретный шрифт (например, «Calibri») с родовым запасным вариантом.
- Сравнить. Если размеры отличаются от базовой линии запасного варианта, шрифт-кандидат установлен; если совпадают с запасным — нет.
- Повторить. Пройтись по списку из сотен распространённых шрифтов, чтобы построить профиль присутствия/отсутствия.
// Определение того, установлен ли конкретный шрифт, через измерение запасного варианта
function isFontInstalled(font) {
const baseFont = 'monospace';
const text = 'mmmmmmmmmmlli';
const span = document.createElement('span');
span.style.fontSize = '72px';
span.style.position = 'absolute';
span.style.left = '-9999px';
span.textContent = text;
document.body.appendChild(span);
span.style.fontFamily = baseFont;
const baseWidth = span.offsetWidth;
// Запрашиваем кандидата с базовым шрифтом как запасным вариантом
span.style.fontFamily = `'${font}', ${baseFont}`;
const testWidth = span.offsetWidth;
document.body.removeChild(span);
return testWidth !== baseWidth; // другая ширина => шрифт присутствует
}
Современные варианты используют Canvas API для более точного измерения текста. Вместо чтения размеров блока элемента скрипт рисует тестовую строку на canvas с помощью measureText() и анализирует возвращённые метрики глифов — которые могут различаться, даже если у двух шрифтов случайно совпала ширина продвижения, что делает определение надёжнее и труднее для обмана грубыми защитами.
Перечисление против Local Font Access API
Полезно разделить две разные возможности:
| Подход | Разрешение | Что раскрывает |
|---|---|---|
| Измерение запасного варианта / canvas | Нет | Присутствие или отсутствие каждого шрифта, который вы специально проверяете, по одному за раз |
queryLocalFonts() | Явный запрос | Полный список установленных начертаний, включая имена PostScript и имена семейств |
Первый подход может ответить только «установлен ли этот шрифт?» для тех шрифтов, которые скрипт заранее решил проверить, поэтому трекеры везут с собой подобранный список из нескольких сотен распространённых семейств. Второй — Local Font Access API, доступный в браузерах на основе Chromium — возвращает полный набор локальных шрифтов за один вызов, но только после того, как пользователь выдаст разрешение local-fonts. Поскольку этот запрос заметен и его легко отклонить, скрытые трекеры используют его редко; тихий метод измерения запасного варианта остаётся рабочей лошадкой фингерпринтинга по шрифтам.
Почему список ваших шрифтов настолько идентифицирует
Наборы шрифтов накапливаются из множества источников, и именно это разнообразие делает их полезными для отслеживания:
- Операционная система и её версия поставляют разные шрифты по умолчанию.
- Установленные приложения — Microsoft Office, Adobe Creative Cloud и дизайнерские инструменты — добавляют характерные семейства шрифтов.
- Языковые и региональные пакеты добавляют письменности (CJK, кириллицу, арабицу), которых нет на многих системах.
- Вручную установленные шрифты от дизайнеров и разработчиков крайне индивидуальны.
Каждый ответ «установлен/не установлен» — это бит энтропии, и несколько сотен проверок складываются в профиль, достаточно отличительный, чтобы выделить многих пользователей — особенно в сочетании с другими сигналами.
Как фингерпринтинг по шрифтам вписывается в общую картину
Фингерпринтинг по шрифтам редко работает в одиночку. Это один из слоёв в стеке, включающем canvas, WebGL, аудио, метрики экрана и данные user-agent. Есть и пересечение с дополнениями браузера: некоторые расширения внедряют собственные шрифты или меняют поведение шрифтов, что может сделать вас более идентифицируемым, а не менее. Понять картину целиком — и есть цель нашего руководства по фингерпринтингу браузера.
Как уменьшить ваш шрифтовой отпечаток
- Используйте браузер, ограничивающий перечисление шрифтов. Tor Browser ограничивает сайты стандартным набором шрифтов, чтобы все выглядели одинаково; режим resist-fingerprinting в Firefox делает похожее. Brave применяет рандомизацию.
- Избегайте установки необычных шрифтов в том профиле браузера, который вы используете для чувствительного к приватности просмотра — чем реже ваш набор, тем вы уникальнее.
- Остерегайтесь расширений, внедряющих шрифты, которые могут расширить ваш обнаружимый список шрифтов.
- Знайте пределы. Как и с другими техниками, приватный режим или инкогнито не останавливает фингерпринтинг по шрифтам; он лишь очищает cookie и историю.
Контринтуитивный урок в том, что защищает единообразие: цель — выглядеть как все остальные, а не добавлять больше нестандартных шрифтов.
Как на самом деле работают самые сильные защиты
Самые эффективные инструменты не столько прячут ваши шрифты, сколько сглаживают различия между пользователями:
- Стандартизация. Tor Browser поставляет фиксированный набор шрифтов и сообщает веб-страницам, что существуют только они, независимо от того, что установлено в действительности. Поэтому каждый пользователь Tor сообщает один и тот же набор шрифтов, сводя энтропию этого сигнала почти к нулю. Режим
privacy.resistFingerprintingв Firefox следует той же философии. - Рандомизация. Brave слегка и для каждой сессии искажает измеряемые значения, так что повторные проверки не возвращают стабильного ответа. Это ломает межвизитную связываемость, которая делает отпечаток полезным, даже если отдельный снимок всё ещё выглядит правдоподобно.
- Сокращение поверхности. Вне укреплённых браузеров держите чистый профиль для чувствительного к приватности просмотра: не устанавливайте экзотические семейства шрифтов и удаляйте расширения, внедряющие шрифты. Стандартная установка ОС гораздо менее уникальна, чем загруженная дизайнерским ПО.
Ни один отдельный переключатель не устраняет фингерпринтинг по шрифтам, и реалистичная цель — сочетать укреплённый браузер с минимальным набором шрифтов. Что касается более широкой модели угроз — как шрифты сочетаются с другими сигналами — W3C в своих рекомендациях по веб-платформе документирует фингерпринтинг как признанную проблему приватности.
Часто задаваемые вопросы
Может ли сайт напрямую увидеть все мои установленные шрифты?
Нет без разрешения. Беспермиссионного API, перечисляющего каждый шрифт, не существует. Сайты выводят ваши шрифты, отрисовывая текст и измеряя подстановку запасного варианта, что выдаёт присутствие или отсутствие по одному шрифту за раз. Новый API queryLocalFonts() может перечислить шрифты, но требует явного запроса разрешения.
Нужно ли фингерпринтингу по шрифтам какое-либо разрешение?
Нет. Метод измерения запасного варианта использует обычную отрисовку текста и определение размеров элементов, что не требует разрешения и не вызывает запроса. Именно это делает его привлекательным для трекеров и трудно заметным для пользователей.
Удалит ли очистка cookie мой шрифтовой отпечаток?
Нет. Отпечаток выводится из того, какие шрифты установлены, а не из сохранённых данных, поэтому очистка cookie или приватный режим его не меняют. Чтобы его уменьшить, нужно ограничить перечисление шрифтов на уровне браузера.
Как проверить, что раскрывает мой браузер?
Запустите проверку отпечатка от BrowserInsight, чтобы увидеть сигналы, которые утекают из вашего браузера, и проверку плагинов и расширений, чтобы оценить дополнения, способные повлиять на ваш шрифтовой профиль.
Заключение
Фингерпринтинг по шрифтам считывает уникальную коллекцию шрифтов, накопленную вашей системой, и превращает её в стабильный идентификатор — без разрешения, без микрофона, без сохранённых данных. Поскольку наборы шрифтов отражают вашу ОС, приложения и привычки, они несут реальную энтропию, особенно рядом с сигналами canvas, WebGL и аудио. Действенная защита — не добавлять больше шрифтов, а сливаться с толпой: используйте браузер, который стандартизирует или рандомизирует перечисление шрифтов, и держите свой приватный профиль обычным.
Рекомендуем прочитать: