Назад в Центр знаний
Отпечатки

Что такое отпечаток шрифтов? Согласованность текста между платформами

Что такое отпечаток шрифтов? Узнайте, как доступность шрифтов, резервный выбор и текстовые метрики раскрывают платформу и влияют на приватность.

BotBrowser Team

Документация

Нужна поддерживаемая продуктовая документация?

У этой статьи есть соответствующая страница в центре документации. Используйте docs для каноничного сценария настройки, актуальных флагов и долгосрочной справки.

BotBrowser может согласовать поведение шрифтов с выбранным профилем и сравнить результаты текста на разных хостах. Он не гарантирует анонимность или принятие сайта, поэтому статья рассматривает шрифты как измеримую границу приватности и совместимости, а не как вывод об идентичности. Медиазапросы CSS дают связанный сигнал дисплея; см. как они раскрывают конфигурацию.

TL;DR

Доступность шрифтов, резервный выбор и текстовые метрики могут раскрывать признаки платформы. Считайте выбранный профиль главным источником, проверяйте представительные многоязычные страницы на разных хостах и рассматривайте видимые изменения как сигнал совместимости, а не доказательство идентичности.

Contents

Что измеряет отпечаток шрифтов

Отпечаток шрифтов использует доступность шрифтов, поведение при резервном выборе и текстовые метрики, чтобы понять, как браузер отображает текст. Сайту не нужно особое разрешение, чтобы увидеть, раскладывается ли текст как в Windows, macOS, Linux или на мобильном устройстве. Он читает обычное поведение отрисовки и может сочетать его с сигналами canvas, WebGL, языка и экрана.

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

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

Страница может наблюдать шрифты тремя обычными способами. Она может запросить текст в семействе с конкретным именем и увидеть, использовалось ли это семейство или замена. Она может опереться на правила резервного выбора из CSS Fonts Level 4, которые описывают, как браузер просматривает список font-family и выбирает другую гарнитуру для символов, которые первый вариант нарисовать не может. И она может вызывать методы измерения, например measureText, который возвращает ширину и ограничивающие рамки строки. Одна и та же строка измеряется по-разному, если выбрана другая гарнитура.

Чтобы это имело значение, странице не нужен прямой список установленных шрифтов. Ширина блоков, переносы строк и высота прокрутки вытекают из использованных гарнитур, поэтому одна только вёрстка уже несёт сведения о платформе. Текст в canvas даёт второй взгляд на то же поведение, потому что пиксели после вызова отрисовки текста зависят от выбранной гарнитуры и растеризатора.

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

Почему согласованность важнее любого отдельного значения

Сравнивайте profileTarget, hostClass и fontMode вместе; храните browserVersion рядом с записью текстовых метрик.

Для команд, отвечающих за приватность, риск редко сводится к одному значению. Риск в несогласованности. Профиль браузера может объявлять себя настольной Windows, тогда как хост показывает поведение текста, характерное для Linux. Мобильная идентичность может нести признаки шрифтов настольного компьютера. Профиль может оставаться стабильным в одной среде и расходиться в другой.

Важны три вида соответствия:

  • Идентичность платформы: профили с целью Windows, macOS, Linux и мобильной платформы не должны показывать признаки шрифтов хоста.
  • Непрерывность сеанса: один и тот же профиль должен давать стабильное поведение текста между запусками и машинами.
  • Согласованность сигналов: поведение шрифтов должно совпадать с брендом браузера, классом устройства, языком и моделью отрисовки профиля.

Хорошая работа со шрифтами не сводится к блокировке вёрстки. Страницам по-прежнему нужен правильно отображаемый текст, а людям нужны читаемые элементы управления. Цель в том, чтобы поведение текста определялось выбранным профилем, а не тем, что установлено на хосте, при сохранении обычной веб-совместимости. Ближе всего к этой теме находится текст в canvas, и согласованность canvas объясняет, как тот же принцип применяется к нарисованным пикселям.

Это особенно важно для серверных развёртываний. Многие производственные парки работают на Linux, потому что это эффективно и легко масштабируется, а нужная команде идентичность браузера может представлять настольную или мобильную среду. Шрифты относятся к самым простым путям, по которым инфраструктура хоста становится видимой, поэтому их стоит проверять явно.

То же сравнение относится к запускам headless и headful, но одинаковый рендеринг не гарантирован на разных хостах, службах дисплея, графических backends или наборах шрифтов. Используйте один профиль и флаги как контролируемые входы, записывайте хост и политику дисплея и сравнивайте полученные метрики, не предполагая совпадения headless-снимков с режимом headful. При расхождении проверьте режим шрифтов и среду рендеринга, прежде чем считать это регрессией продукта.

Как сохранить согласованный текст на разных хостах

Режим профиля и встроенные наборы шрифтов

При поддержке профиля, хоста, лицензии и режима шрифты профиля могут согласовать доступность шрифтов и метрики текста с целевой платформой. Проверяйте конкретные профиль, хост, лицензию и режим; соответствие не гарантируется для всех поверхностей рендеринга. Для переносимости Linux/Ubuntu требуется ENT Tier1; поддержка шрифтов Android относится к PRO.

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

Когда expand или real выбраны намеренно

Поведение шрифтов задаётся параметром --bot-fonts, у которого три режима:

  • profile используется по умолчанию и применяет шрифты, встроенные в профиль.
  • expand применяет шрифты профиля и добавляет резервный выбор из шрифтов хоста.
  • real использует реальные системные шрифты и не даёт защиты шрифтов.

Оставляйте --bot-fonts=profile, когда важна согласованность между хостами, потому что тогда состав шрифтов профиля и его правила резервного выбора остаются главными. Используйте expand или real только тогда, когда рабочий процесс намеренно допускает вариативность хоста и эта вариативность входит в план проверки. Если список шрифтов в проверке показывает шрифты хоста, сначала проверьте режим, а уже потом ищите причину в другом месте.

Страницы CJK и со смешанными письменностями

Текст CJK сильно зависит от языковых пакетов, порядка резервного выбора и поведения отрисовки, поэтому по нему быстрее всего заметить утечку хоста. Отсутствующие глифы обычно означают, что в доступном составе нет подходящей гарнитуры, а документация BotBrowser отмечает, что профили Windows и macOS по умолчанию включают поддержку CJK. Подробности о китайском, японском и корейском тексте читайте в материале отображение шрифтов CJK. О более широком вопросе стабильности одного профиля в разных операционных системах см. документацию по профилям.

Подготовьте представительный набор текстов

До сравнения задайте для каждой контрольной точки pageId, viewport, zoomPercent, profilePackage и applicationRevision.

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

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

Языковое покрытие должно следовать за реальными пользователями. Продукту, который поддерживает английский, испанский, французский, русский и китайский, нужен представительный текст на каждом поддерживаемом языке. Добавьте японский, корейский, арабский, иврит или другие письменности, если они есть в продукте. Включите записи со смешанными языками, где имена, адреса или позиции каталога часто используют больше одной письменности.

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

Записывайте ожидаемую область просмотра и масштаб для каждой визуальной контрольной точки, потому что перенос строки из-за другой области просмотра не является регрессией шрифтов. В записи выпуска также укажите семейство профилей, версию BotBrowser, базовый образ и ревизию приложения. Эти сведения позволяют другому специалисту повторить ту же проверку с точки зрения пользователя без сбора лишних данных о машине.

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

Проверка текста должна включать состояния, которые появляются после действия человека. Открытые меню, сообщения проверки, подсказки автодополнения, модальные окна и состояния загрузки часто имеют более жёсткие ограничения вёрстки, чем начальная страница. Пройдите по тем же состояниям с клавиатуры, потому что индикаторы фокуса, вспомогательный текст и сводки ошибок могут использовать другую типографику, чем обычное содержимое.

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

Проверка на разных хостах и утверждение результатов

Сравнение между хостами

Для каждой пары записывайте baselineId, candidateHost, renderingBackend и visualDecision, привязанное к проверенной странице.

Проверка между хостами отвечает на простой вопрос: сохраняет ли один и тот же утверждённый профиль одинаково пригодный текст на каждом поддерживаемом классе рабочих узлов? Запустите представительный набор на хостах, которые используются в производстве, и сравните результаты с утверждённой базой.

  • Запустите один и тот же профиль на двух разных операционных системах хоста.
  • Сравните представительную страницу с обычным текстом, текстом CJK, если он нужен, и текстом в canvas, если он входит в рабочий процесс.
  • Убедитесь, что наблюдаемое поведение соответствует цели профиля, а не машине хоста.
  • Сохраните результат в пакете проверки выпуска или профиля.

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

Считайте блокирующими проблемами отсутствующие символы, нечитаемые элементы управления, неожиданную замену символов и текст, который накладывается на соседнее содержимое. Изменённый перенос строки может быть приемлемым, если информация не потеряна и страница остаётся стабильной. Зафиксируйте решение вместе с ответственным за страницу, чтобы то же изменение не обсуждалось снова при следующем выпуске.

Снимки экрана служат полезным подтверждением, но не единственным. Выделение текста, ввод в формы, копирование и вставка, вывод в PDF и подписи для специальных возможностей могут выявить проблемы, заметные клиенту, которых статичное изображение не показывает. Назначьте ответственного для каждой представительной страницы и семейства профилей. Этот человек решает, ожидаема ли видимая разница, обновляет базу при изменении типографики продукта и фиксирует решение о выпуске.

Записи выпуска и обновления

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

По возможности обновляйте один слой за раз. Сначала проверьте новый выпуск BotBrowser с уже утверждённым профилем и образом. Затем проверьте запланированное обновление профиля. В конце проверьте любое изменение базового образа или языкового пакета. Такой порядок сужает источник визуального изменения и упрощает решения об откате. Добавление или удаление языкового пакета либо обновление настольной библиотеки может изменить обычный текст, поэтому пропускайте новый образ через те же проверки, прежде чем он попадёт в пул рабочих узлов.

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

Когда база меняется намеренно, храните прежний результат достаточно долго, чтобы объяснить переход, с коротким указанием причины, например обновления типографики продукта или семейства профилей. Не смешивайте в одной базе несвязанные семейства профилей, потому что у настольных, мобильных и планшетных макетов разные ожидания. Срок хранения должен следовать обычной политике организации по качеству и приватности, а персональные данные нужно скрывать до того, как снимок попадёт в долговременную запись.

Действия при видимом изменении

Когда текст неожиданно меняется, приостановите широкое развёртывание и воспроизведите затронутую страницу с записанными профилем, версией браузера, образом, областью просмотра и ревизией приложения. Подтвердите изменение на чистом рабочем узле, прежде чем менять конфигурацию. Так постоянная проблема выпуска отделяется от повреждённого кеша или одного неисправного хоста.

Затем сравните последнюю утверждённую комбинацию с кандидатом, меняя между запусками только один компонент. Если разница следует за базовым образом, проверьте недавние изменения пакетов. Если она следует за профилем, вернитесь к утверждённому профилю, пока ответственный изучает обновление. Если она следует за приложением, передайте результат ответственному за страницу.

Если в проверке используются также необязательные настройки шума для ClientRects и текстовых прямоугольников, которые по умолчанию отключены, зафиксируйте начальное значение шума на время сравнения. Без фиксированного значения результаты измерений меняются от сеанса к сеансу, и проверяющий не может отличить задуманную вариативность от настоящего изменения. При фиксированном значении повторные сеансы дают одинаковый результат измерений, и сравнение остаётся осмысленным.

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

Что BotBrowser охватывает в работе со шрифтами и что нет

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

Для более подробного разбора см. Fingerprinting измерения текста: субпиксельное отслеживание.

Заключение

Используйте --bot-fonts=profile, когда нужно стабильное поведение текста на разных хостах. Поддерживайте небольшой многоязычный набор контрольных точек, сравнивайте его на каждом поддерживаемом классе хостов и до развёртывания разбирайте отсутствующие глифы, обрезанные подписи или изменения разбивки на страницы. Согласованность шрифтов улучшает измеримую границу совместимости, но не доказывает анонимность или принятие сайта.

Открытые источники

#шрифты#fingerprinting#метрики текста#приватность#сигналы браузера#согласованность профилей

Эта статья входит в руководство: Что такое отпечаток браузера?

Переведите BotBrowser из исследований в продакшн

Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.