AntiDetect
Возможности Технология Цены Для кого
Документация Блог FAQ
Язык
EnglishItalianoDeutschEspañolРусский
Скачать

Отпечаток — это история, а не список

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

От значений к связям

Ранний фингерпринтинг был списком пунктов. Собрать canvas, WebGL, шрифты, размер экрана, часовой пояс; посчитать общий хеш; сравнить его. Совпал с известным плохим значением — блокировать.

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

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

Вы не пытаетесь получить необычный отпечаток. Вы пытаетесь получить ничем не примечательный — правдоподобное описание обычного компьютера, который просто не ваш.

Какие противоречия проверяют

Это корреляции, которые чаще всего встречаются в реальной логике обнаружения. Ни одна не экзотична, все дешёвые.

GPU против платформы

Строка незамаскированного рендерера WebGL называет реальный чип и реальный путь драйвера. ANGLE (Apple, Apple M2, OpenGL 4.1) — это Mac. ANGLE (NVIDIA, NVIDIA GeForce RTX 4070 Direct3D11 vs_5_0 ps_5_0, D3D11) — это Windows: Direct3D больше нигде не существует. User agent, заявляющий macOS рядом с рендерером D3D11, — не редкое устройство, а невозможное.

GPU против экрана

Машины с видеокартой серии M и экраном 1366×768 при devicePixelRatio 1 не существует — Apple не выпускала такую панель в соответствующий период. Встроенная графика десятилетней давности рядом с дисплеем 3840×2160 столь же маловероятна. Поставщики систем обнаружения держат таблицы распределения ровно для таких пар.

Шрифты против операционной системы

Наборы шрифтов — это подписи ОС. Segoe UI идёт с Windows. SF Pro и Helvetica Neue — с macOS. Ubuntu и семейство Liberation — с распространёнными дистрибутивами Linux. Профиль «Windows», который не может отрисовать Segoe UI, провалил проверку, стоившую трекеру одного вызова measureText. Поверхность шрифтов заслуживает отдельного разбора — и получает его.

Часовой пояс против IP

Самый частый прокол и наименее технический. Intl.DateTimeFormat().resolvedOptions().timeZone возвращает то, чем браузер себя считает; IP говорит, откуда пришло соединение. Бразильский резидентный IP с Europe/Rome — несоответствие, которое пометит любой начинающий инженер. Хуже того, браузер отдаёт ещё и сырой getTimezoneOffset(), так что профиль, подменяющий имя IANA, но не смещение, противоречит сам себе вообще без внешних данных.

Язык против всего остального

Языковых поверхностей три, а задают обычно две: HTTP-заголовок Accept-Language, navigator.languages в JavaScript и локаль, которую разрешает Intl API. Мы видели рабочие профили, одновременно сообщавшие it-IT из JavaScript и en-US,en;q=0.9 в заголовке. Это ошибка конфигурации, видимая в логе запросов.

Цифры железа против класса устройства

hardwareConcurrency и deviceMemory должны описывать машину, которую кто-то действительно купил. deviceMemory по спецификации квантуется значениями 0.25, 0.5, 1, 2, 4, 8 — значение 6 не просто необычно, оно вне спецификации. Шестьдесят четыре логических ядра рядом с заявленными 4 ГБ памяти не описывают ничего из имеющегося на рынке.

Сенсорный ввод против форм-фактора

maxTouchPoints > 0 при десктопном user agent, без соответствующего профиля устройства с сенсорным экраном, — типичный остаток от копирования мобильного отпечатка. Как и мобильный user agent с экраном 1920×1080 и указателем мыши.

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

Проверка по двум контекстам

Помимо попарного правдоподобия есть более строгий тест, и именно он завершает сессии: задайте один и тот же вопрос в двух местах и сравните.

Браузер предоставляет несколько контекстов выполнения, которые должны описывать одну и ту же машину, — главное окно, Web Worker, iframe и Service Worker. Переопределение на уровне страницы обычно достаёт только до первого. Скрипты обнаружения читают hardwareConcurrency, deviceMemory, platform, userAgent и строки WebGL из worker и сравнивают их с окном.

Невинного объяснения расхождению нет. Это не эвристика с долей ложных срабатываний, это доказательство. Это самый сильный довод в пользу того, чтобы заниматься отпечатками в движке, а не во внедрённом скрипте, и подробнее он разобран в статье про CDP.

Где ошибаются генераторы случайных профилей

Инструменты, создающие «случайный отпечаток», обычно выбирают каждое поле независимо из списка правдоподобных значений. Каждое поле по отдельности выглядит нормально. Комбинация нередко абсурдна.

Независимая выборка даёт видеокарту Mac с набором шрифтов Windows, экран 4K на встроенной графике 2014 года или user agent Chrome 147 со списком брендов userAgentData от Chrome 131. Каждое значение прошло собственную проверку; описанной машины не существует.

Лечится это выборкой машины, а не полей. Начните с архетипа реального устройства — скажем, ThinkPad 2023 года с графикой Iris Xe, 16 ГБ ОЗУ, панелью 1920×1080 и набором шрифтов Windows 11 — и выводите каждое значение из него. Варьируйте внутри реалистичного диапазона архетипа, но никогда между архетипами.

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

Обычный лучше уникального

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

Комфортное место — середина распределения. Экран 1920×1080, 8 или 16 ГБ ОЗУ, 8 логических ядер, видеокарта среднего уровня, набор шрифтов по умолчанию для этой ОС и часовой пояс, совпадающий с выходным IP. Скучно по всем параметрам — и так же, как у миллионов других машин.

Не поддавайтесь соблазну выбрать впечатляющее железо. Рабочая станция на 32 ядра со 128 ГБ памяти запоминается, а запоминаться — ровно то, чего вам не нужно.

Чек-лист, который можно пройти

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

  1. Геолокация IP, timeZone и getTimezoneOffset() указывают на одно и то же место.
  2. Accept-Language, navigator.languages и разрешённая локаль Intl согласуются.
  3. Рендерер WebGL называет чип, который поставляется с платформой из user agent.
  4. Список шрифтов — набор по умолчанию для этой версии ОС, и ничего экзотического сверху.
  5. Разрешение экрана и devicePixelRatio описывают панель, продававшуюся с таким классом видеокарты.
  6. deviceMemory — допустимое значение, и hardwareConcurrency рядом с ним правдоподобен.
  7. Web Worker возвращает те же значения, что и окно.
  8. Хеш canvas стабилен между отрисовками и между сессиями — см. почему это важно.
  9. WebRTC не сообщает IP, отличный от прокси. Эта утечка происходит незаметно.
  10. Бренды в navigator.userAgentData соответствуют старшей версии Chrome из строки user agent.

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

Профили на основе архетипов реальных устройств

P8 создаёт каждый отпечаток из согласованного аппаратного профиля, чтобы видеокарта, шрифты, экран и платформа описывали одну машину, а не четыре.

Начать бесплатно
Все статьи Далее: шум на canvas — сам по себе отпечаток