Защита шрифтовых отпечатков с BotBrowser
Как BotBrowser контролирует списки шрифтов и метрики текста на уровне движка браузера для согласованных шрифтовых сигналов между платформами.
Риск для конфиденциальности
Установленные шрифты и метрики рендеринга текста создают сигнал отслеживания. Комбинация доступных шрифтов варьируется в зависимости от ОС, установленных приложений и языковых пакетов. API измерения текста также производят результаты, специфичные для платформы, из-за различий в движках рендеринга шрифтов.
Решение BotBrowser
BotBrowser контролирует шрифтовые сигналы на уровне движка браузера, а не через инъекцию JavaScript или блокировку API.
Списки шрифтов, согласованные с платформой
Когда профиль нацелен на определенную платформу, BotBrowser сообщает соответствующие шрифты независимо от ОС хоста:
chrome --bot-profile="/path/to/windows-profile.enc" \
--user-data-dir="$(mktemp -d)"
Запросы перечисления шрифтов возвращают правильный набор шрифтов для целевой платформы.
Согласование метрик шрифтов
API измерения текста возвращают метрики, согласованные с движком рендеринга шрифтов целевой платформы:
- Результаты
measureText() - Размеры смещения элементов с определенными шрифтами
- Измерения ограничивающего прямоугольника шрифтов
Блокировка не требуется
В отличие от расширений, блокирующих доступ к шрифтам (что само по себе обнаруживаемо), BotBrowser позволяет нормальное использование API шрифтов, контролируя результаты. Сайты работают нормально, но сигналы соответствуют профилю.
Верификация
После загрузки профиля проверьте согласованность шрифтов:
const { chromium } = require('playwright-core');
const browser = await chromium.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
'--bot-profile=/path/to/windows-profile.enc',
],
headless: true,
});
const page = await (await browser.newContext()).newPage();
const fontCheck = await page.evaluate(() => {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
ctx.font = '72px monospace';
const fallbackWidth = ctx.measureText('mmmmm').width;
ctx.font = '72px Arial, monospace';
const arialWidth = ctx.measureText('mmmmm').width;
return {
arialAvailable: arialWidth !== fallbackWidth,
arialWidth,
fallbackWidth,
};
});
console.log('Проверка шрифтов:', fontCheck);
Ключевые проверки:
- Доступность шрифтов соответствует целевой платформе
- Метрики текста не раскрывают реальную ОС хоста
- Нет предупреждений "font access blocked"
Начало работы
- Скачайте BotBrowser с GitHub
- Загрузите профиль, соответствующий желаемой платформе, с помощью
--bot-profile - Протестируйте согласованность шрифтов с помощью инструментов тестирования отпечатков
- Прочитайте руководство по шрифтам для подробностей