Font Enumeration beyond Canvas: как CSS и JavaScript раскрывают скрытые шрифты

BadB

Professional
Messages
2,296
Reaction score
2,305
Points
113
Глубокий разбор методов детектирования нестандартных шрифтов через getComputedStyle и layout metrics

Введение: Шрифты — невидимый отпечаток​

Вы тщательно настроили 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​

Этот метод использует изменение ширины текста при смене шрифта.

Как работает:
  1. Создаётся элемент с текстом:
    HTML:
    <span id="test">mmmmmmmmmmlli</span>
  2. Измеряется ширина с системным шрифтом:
    js:
    Code:
    const defaultWidth = document.getElementById('test').offsetWidth;
  3. Применяется тестируемый шрифт:
    js:
    Code:
    document.getElementById('test').style.fontFamily = 'Arial, sans-serif';
  4. Если ширина изменилась → шрифт установлен.

💀 Проблема:
Этот метод не требует 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).
Как работает:
  1. Создаётся элемент с парой символов, чувствительных к kerning:
    HTML:
    <span id="kern">AV</span>
  2. Измеряется расстояние между символами через getBoundingClientRect(),
  3. Сравнивается с эталонными значениями для каждого шрифта.

💀 Результат:
Даже один уникальный шрифт (например, Cyrillic Font) создаёт уникальную метрику.

Часть 3: Как фрод-движки используют эти данные​

🧠 Построение font-профиля​

Системы собирают:
  • Список всех доступных шрифтов,
  • Их метрики (ширина, высота, kerning),
  • Языковую принадлежность (латиница, кириллица, иероглифы).

Пример аномалии:
ПараметрВаш профильРеальный пользователь
Шрифты15045
КириллицаДаНет (en-US)
Adobe FontsДаНет

💀 Результат:
Fraud Score = 95+, даже если Canvas идеален.

Часть 4: Как проверить свою уязвимость​

🔍 Шаг 1: Используйте тестовые сайты​


🔍 Шаг 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: ОС и браузер​

🪟 Windows
  1. Удалите все несистемные шрифты:
    • Откройте C:\Windows\Fonts,
    • Удалите всё, кроме:
      • Arial, Times New Roman, Calibri, Courier New, Verdana, Tahoma.
  2. Перезагрузите систему.

🦊 Firefox
  1. Введите about:config,
  2. Найдите:
    • layout.css.font-visibility.level → 1 (показывает только системные шрифты).

🦒 Chrome / Chromium
  • Нет встроенного способа скрыть шрифты,
  • Используйте антидетект-браузеры.

🔸 Уровень 2: Антидетект-браузеры​

🐬 Dolphin Anty
  1. При создании профиля,
  2. В разделе Fonts,
  3. Выберите: «System Fonts Only»,
  4. Убедитесь, что список содержит только 25 шрифтов.

🌐 Linken Sphere
  1. В настройках профиля,
  2. Найдите «Font List»,
  3. Отключите «Custom Fonts».

💡 Проверка:
После настройки обязательно протестируйте на amiunique.org.

Часть 6: Почему большинство кардеров терпят неудачу​

❌ Распространённые ошибки​

ОшибкаПоследствие
Установка Adobe FontsВыдаёт дизайнера/кардера → high-risk
Оставление кириллических шрифтовНесоответствие с en-US → аномалия
Игнорирование getComputedStyleУтечка через CSS → бан

💀 Полевые данные (2026):
80% провалов связаны с избыточным списком шрифтов.

Заключение: Шрифты — это не декор, а данные​

Каждый шрифт — это бит информации о вашей системе. И фрод-движки читают эту информацию даже без Canvas.

💬 Финальная мысль:
Настоящая анонимность — не в количестве шрифтов, а в их правдоподобии.
Потому что в мире fingerprinting’а, даже буква может выдать вас.

Оставайтесь минимальными. Оставайтесь системными.
И помните: в мире сетевой безопасности, шрифт — это отпечаток.
 
Top