BadB
Professional
- Messages
- 2,296
- Reaction score
- 2,305
- Points
- 113
Глубокий разбор методов детектирования нестандартных шрифтов через getComputedStyle и layout metrics
Почему?
Потому что шрифты можно обнаружить даже без Canvas. Современные фрод-движки (Cloudflare, Forter, Sift) используют CSS и JavaScript API, чтобы перечислить все установленные шрифты — включая те, что вы «скрыли» от Canvas.
В этой статье мы проведём глубокий технический разбор того, как работают методы font enumeration через getComputedStyle и layout metrics, и как полностью защититься от этой утечки.
Этот метод использует изменение ширины текста при смене шрифта.
Как работает:
Современные браузеры предоставляют API для проверки шрифтов.
Как работает:
js:
Этот метод анализирует высоту строки (line-height) и межбуквенный интервал (kerning).
Как работает:
Системы собирают:
Пример аномалии:
js:
Windows
Firefox
Chrome / Chromium
Dolphin Anty
Linken Sphere
Оставайтесь минимальными. Оставайтесь системными.
И помните: в мире сетевой безопасности, шрифт — это отпечаток.
Введение: Шрифты — невидимый отпечаток
Вы тщательно настроили Canvas noise, WebGL renderer, WebRTC. Вы ограничили список шрифтов до 25 системных. Но при первом же заходе на сайт вас мгновенно блокируют.Почему?
Потому что шрифты можно обнаружить даже без Canvas. Современные фрод-движки (Cloudflare, Forter, Sift) используют CSS и JavaScript API, чтобы перечислить все установленные шрифты — включая те, что вы «скрыли» от Canvas.
В этой статье мы проведём глубокий технический разбор того, как работают методы font enumeration через getComputedStyle и layout metrics, и как полностью защититься от этой утечки.
Часть 1: Почему шрифты — мощный сигнал fingerprinting’а
Статистика уникальности
- У среднего пользователя Windows 10: 40–60 шрифтов,
- У кардера с кастомными шрифтами: 100–300+ шрифтов,
- Энтропия: 15–20 бит → 1 из 1 миллиона.
Ключевой факт:
Наличие Adobe Fonts, Google Fonts или кириллических шрифтов мгновенно выдаёт поддельный профиль.
Часть 2: Методы детектирования шрифтов без Canvas
Метод 1: getComputedStyle + offsetWidth
Этот метод использует изменение ширины текста при смене шрифта.Как работает:
- Создаётся элемент с текстом:
HTML:<span id="test">mmmmmmmmmmlli</span> - Измеряется ширина с системным шрифтом:
js:
Code:const defaultWidth = document.getElementById('test').offsetWidth; - Применяется тестируемый шрифт:
js:
Code:document.getElementById('test').style.fontFamily = 'Arial, sans-serif'; - Если ширина изменилась → шрифт установлен.
Проблема:
Этот метод не требует Canvas и работает даже в headless-режиме.
Метод 2: FontFaceSet.check()
Современные браузеры предоставляют API для проверки шрифтов.Как работает:
js:
Code:
// Проверка наличия шрифта
if (document.fonts.check("12px 'Helvetica Neue'")) {
console.log("Helvetica Neue installed");
}
Преимущество для фрод-движков:
Это нативный API, который точно определяет наличие шрифта.
Метод 3: Layout Metrics через IntersectionObserver
Этот метод анализирует высоту строки (line-height) и межбуквенный интервал (kerning).Как работает:
- Создаётся элемент с парой символов, чувствительных к kerning:
HTML:<span id="kern">AV</span> - Измеряется расстояние между символами через getBoundingClientRect(),
- Сравнивается с эталонными значениями для каждого шрифта.
Результат:
Даже один уникальный шрифт (например, Cyrillic Font) создаёт уникальную метрику.
Часть 3: Как фрод-движки используют эти данные
Построение font-профиля
Системы собирают:- Список всех доступных шрифтов,
- Их метрики (ширина, высота, kerning),
- Языковую принадлежность (латиница, кириллица, иероглифы).
Пример аномалии:
| Параметр | Ваш профиль | Реальный пользователь |
|---|---|---|
| Шрифты | 150 | 45 |
| Кириллица | Да | Нет (en-US) |
| Adobe Fonts | Да | Нет |
Результат:
Fraud Score = 95+, даже если Canvas идеален.
Часть 4: Как проверить свою уязвимость
Шаг 1: Используйте тестовые сайты
- https://amiunique.org — показывает font entropy,
- https://browserleaks.com/fonts — перечисляет все шрифты.
Шаг 2: Запустите локальный тест
js:
Code:
// Тест через getComputedStyle
const testFonts = ['Arial', 'Times New Roman', 'Helvetica', 'Cyrillic Font'];
testFonts.forEach(font => {
const span = document.createElement('span');
span.textContent = 'mmmmmmmmmmlli';
span.style.fontFamily = font;
document.body.appendChild(span);
const width = span.offsetWidth;
document.body.removeChild(span);
console.log(`${font}: ${width}px`);
});
Правило:
Если ширина отличается от системных шрифтов → шрифт установлен.
Часть 5: Как полностью защититься
Уровень 1: ОС и браузер
- Удалите все несистемные шрифты:
- Откройте C:\Windows\Fonts,
- Удалите всё, кроме:
- Arial, Times New Roman, Calibri, Courier New, Verdana, Tahoma.
- Перезагрузите систему.
- Введите about:config,
- Найдите:
- layout.css.font-visibility.level → 1 (показывает только системные шрифты).
- Нет встроенного способа скрыть шрифты,
- Используйте антидетект-браузеры.
Уровень 2: Антидетект-браузеры
- При создании профиля,
- В разделе Fonts,
- Выберите: «System Fonts Only»,
- Убедитесь, что список содержит только 25 шрифтов.
- В настройках профиля,
- Найдите «Font List»,
- Отключите «Custom Fonts».
Проверка:
После настройки обязательно протестируйте на amiunique.org.
Часть 6: Почему большинство кардеров терпят неудачу
Распространённые ошибки
| Ошибка | Последствие |
|---|---|
| Установка Adobe Fonts | Выдаёт дизайнера/кардера → high-risk |
| Оставление кириллических шрифтов | Несоответствие с en-US → аномалия |
| Игнорирование getComputedStyle | Утечка через CSS → бан |
Полевые данные (2026):
80% провалов связаны с избыточным списком шрифтов.
Заключение: Шрифты — это не декор, а данные
Каждый шрифт — это бит информации о вашей системе. И фрод-движки читают эту информацию даже без Canvas.Финальная мысль:
Настоящая анонимность — не в количестве шрифтов, а в их правдоподобии.
Потому что в мире fingerprinting’а, даже буква может выдать вас.
Оставайтесь минимальными. Оставайтесь системными.
И помните: в мире сетевой безопасности, шрифт — это отпечаток.