antibrowser
English中文

техника

Canvas fingerprint: как сайты рисуют отпечаток браузера

Canvas fingerprint — невидимый метод слежки: сайт рисует изображение в браузере и читает пиксели. Разбираем механику, уникальность и 3 способа подмены.

Иван11 мин чтения
Схема canvas fingerprint: браузер рендерит скрытый текст на холсте, сайт считывает пиксели и формирует уникальный хэш устройства

Canvas fingerprint — метод, при котором сайт незаметно рисует изображение внутри HTML-элемента <canvas>, считывает пиксели и превращает их в хэш — уникальный идентификатор устройства. Работает без cookie, без хранилища на стороне браузера, даже в приватном режиме. Разные GPU, шрифты и движки рендеринга дают разные пиксели, и сайт отличает один браузер от другого без каких-либо разрешений от пользователя.

Что такое canvas fingerprint

Canvas — стандартный HTML5-элемент, изначально предназначенный для отрисовки графики в браузере через JavaScript. Сайт создаёт его через document.createElement('canvas'), делает невидимым через CSS и командует нарисовать что-то: набор символов, градиент, несколько геометрических фигур. Затем вызывает toDataURL() или getImageData(), получает массив байт и хэширует результат. Этот хэш и есть canvas fingerprint.

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

Canvas fingerprint появился в академической литературе в 2012 году. К 2016-му большинство крупных рекламных сетей и антифрод-систем включили его в стандартный набор сигналов. Сегодня он входит в отпечаток браузера наряду с user-agent, разрешением экрана, часовым поясом, списком шрифтов и десятками других параметров. Ключевое свойство — пассивность: пользователь не видит ничего, что происходит на скрытом холсте, никакого запроса разрешений, никакого уведомления.

Как работает механизм снятия отпечатка

Весь процесс занимает несколько миллисекунд и целиком скрыт от пользователя. Сайт исполняет примерно такой код:

!Механическое перо рисует светящийся градиент на крошечном холсте, а пиксели уносятся в тёмный куб-хэш

const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
ctx.textBaseline = 'top';
ctx.font = '14px Arial';
ctx.fillStyle = '#f60';
ctx.fillRect(125, 1, 62, 20);
ctx.fillStyle = '#069';
ctx.fillText('Canvas fingerprint test \uD83C\uDF10', 2, 15);
const dataURL = canvas.toDataURL();

fillText передаёт инструкцию рендеру операционной системы, а не браузеру напрямую. Браузер вызывает системные библиотеки шрифтов — FreeType в Linux, DirectWrite в Windows, Core Text в macOS — и те отрисовывают глифы по-своему. Пиксели отличаются не только между платформами, но и между версиями одного и того же рендерера на одной платформе.

Canvas fingerprint не хранится в браузере — сайт каждый раз вычисляет его заново. Именно поэтому очистка cookie и история браузера его не стирают.

Сайт не обязательно рисует текст: некоторые реализации используют градиенты, дуги, тени или их комбинации. Принцип тот же — собрать пиксельный сигнал, максимально зависящий от аппаратной и программной среды конкретного устройства. В результате toDataURL() возвращает строку base64, которую хэшируют (чаще всего алгоритмами murmur3, MD5 или SHA-256) и записывают в базу данных вместе с другими сигналами. Детальнее о том, как сайты читают параметры браузера целиком, — в статье «Что сайты читают о вас».

Почему одна и та же инструкция даёт разный результат

Одна и та же команда fillText('Hello') на разных устройствах даёт разные пиксели — и это не баг, а прямое следствие архитектуры рендеринга. Браузер делегирует отрисовку текста операционной системе, а та — GPU-драйверу. На каждом уровне появляются собственные алгоритмы субпиксельного сглаживания, хинтинга шрифтов и гамма-коррекции. Движок рендеринга шрифтов — Skia в Chrome, Cairo в Firefox — добавляет ещё один слой различий.

!Три одинаковых стеклянных панели с одним и тем же мазком, который на каждой отрисован чуть по-разному

На итоговые пиксели влияют сразу несколько факторов:

  • GPU и драйвер. Алгоритм антиалиасинга у Intel, NVIDIA и AMD отличается. Даже одна видеокарта с разными версиями драйвера может дать разный хэш.
  • ОС и её версия. Windows 10 и Windows 11 используют разные версии DirectWrite. macOS Ventura и Sonoma по-разному обрабатывают субпиксельное сглаживание.
  • Установленные шрифты. Текст рисуется той гарнитурой, которая реально есть в системе. Если Arial заменяется фолбэком — пиксели меняются.
  • Масштаб дисплея (DPI). При 125% и 150% масштабировании одни и те же символы занимают разное число пикселей.
  • Язык и настройки локали. Влияют на правила кернинга и лигатуры при отдельных сочетаниях символов.

Именно комбинация этих факторов делает canvas-отпечаток устойчивым. Воспроизвести точно такой же хэш на другом железе практически невозможно без перехвата на уровне API — и именно поэтому подделка canvas требует работы внутри самого браузера, а не поверх него.

WebGL: второй слой идентификации

WebGL fingerprint работает по тому же принципу, что и canvas, но задействует трёхмерный рендеринг. Сайт передаёт GPU шейдеры и геометрию, рендерит сцену и считывает пиксели через readPixels(). Разные видеокарты и версии драйвера дают разные результаты — вплоть до одного пикселя. При этом WebGL раскрывает не только рендер-хэш, но и строки RENDERER и VENDOR через gl.getParameter() — точное название GPU и производителя.

WebGL-строки RENDERER и VENDOR — это отдельный параметр, независимый от того, что нарисовано на холсте. Сайт фиксирует их без всякого рендеринга сцены, одним вызовом.

Через WebGL антифрод-система получает сразу несколько сигналов: строки gl.RENDERER и gl.VENDOR (например, NVIDIA GeForce RTX 4060/PCIe/SSE2), список поддерживаемых расширений WebGL, максимальный размер текстуры и другие аппаратные ограничения, пиксельный хэш рендер-сцены. Эти данные в совокупности дают идентификатор, который стабильнее чистого canvas-отпечатка: строки GPU меняются только при смене железа или обновлении драйвера.

Антифрод-системы применяют WebGL как самостоятельный сигнал и как перекрёстную проверку. Если canvas-хэш заменён, а WebGL-строки остались от реального железа — система видит несоответствие. Подробнее о том, какие параметры проверяют антифрод-системы при анализе входящего трафика, — в материале «Как сайты определяют прокси».

Насколько уникален canvas-отпечаток на практике

Canvas fingerprint в сочетании с другими сигналами позволяет однозначно идентифицировать браузер в подавляющем большинстве случаев. Исследования в рамках проекта Cover Your Tracks (Electronic Frontier Foundation) показывают: комбинированный отпечаток из canvas, WebGL и ещё 15–20 параметров уникален более чем у 90% пользователей из типичной выборки. Сам по себе canvas-хэш менее уникален — примерно один из 100–200 пользователей имеет совпадающий результат, — но именно поэтому его никогда не используют изолированно.

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

Совокупный отпечаток браузера из 20–30 параметров, включая canvas и WebGL, даёт уникальность выше 99%. Именно поэтому крупные платформы не ограничиваются одним сигналом, а собирают полный профиль и сравнивают его целиком. Чтобы проверить, насколько ваш текущий браузер выглядит уникальным, используйте публичные инструменты вроде Cover Your Tracks от EFF. Что именно они показывают и как интерпретировать результаты — объяснено в статье «Как проверить отпечаток браузера».

Как сайты применяют canvas fingerprint

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

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

Отслеживание без авторизации. Рекламные сети собирают canvas-отпечаток посетителей лендингов для частотного ограничения показов и атрибуции конверсий. Пользователь не авторизован — отпечаток всё равно связывает его сессии между собой и с другими визитами.

Обнаружение автоматизации. Headless-браузеры (Puppeteer, Playwright без специальных патчей) рендерят canvas иначе, чем реальный Chrome на реальном железе. Системы обнаружения ботов сравнивают хэш с библиотекой известных headless-сигнатур и повышают скор при совпадении.

Canvas fingerprint — это не закон, а вероятность. Сайт не блокирует аккаунт только из-за него — он суммирует риск-скор из десятков сигналов. Но если canvas совпадает с уже заблокированным профилем, этот скор резко вырастает.

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

Подмена canvas: методы и их реальная эффективность

Защититься от canvas fingerprint можно тремя основными способами. Их результаты существенно отличаются по надёжности.

Случайный шум в пиксели. Расширение или антидетект перехватывает вызовы toDataURL() и getImageData() и слегка меняет значения пикселей — обычно на ±1 по каждому цветовому каналу. Хэш меняется при каждом вызове. Проблема: если шум генерируется случайно, отпечаток нестабилен даже внутри одной сессии, и сайт фиксирует аномалию через повторные измерения.

Полная блокировка API. Некоторые расширения возвращают пустой canvas или выбрасывают ошибку при вызове toDataURL(). Это ломает уникальность, но одновременно делает браузер аномальным: нормальный Chrome никогда не возвращает пустой холст. Такой сигнал детектируется надёжнее, чем реальный уникальный хэш.

Детерминированный шум на уровне профиля. Расширение или движок вносит всегда одни и те же поправки в пиксели — определяемые seed-значением, уникальным для профиля. Хэш стабилен внутри одной сессии, уникален между профилями, соответствует реалистичному диапазону значений.

Единственный надёжный подход — детерминированный шум на уровне профиля: один и тот же хэш в рамках одной сессии, разный между профилями. Случайный шум и блокировка API детектируются разными методами, но одинаково надёжно.

МетодСтабильность внутри сессииОбнаруживаемостьСовместимость с сайтами
Случайный шумНизкаяСредняяВысокая
Детерминированный шум на профильВысокаяНизкаяВысокая
Блокировка APIВысокаяОчень высокаяНизкая
Фиксированный фейк без шумаВысокаяСредняяВысокая

Как антидетект-браузер работает с canvas

Антидетект-браузер решает задачу canvas fingerprint на уровне движка, а не расширения. Разница принципиальная: расширение Chrome работает в изолированном контексте и детектируется через timing-анализ или проверку chrome.runtime. Патч на уровне движка перехватывает вызовы на уровне C++ до того, как JavaScript получает результат — браузер не знает, что его вывод изменён.

!Матовая маска скользит по светящемуся отпечатку, оставляя за собой ровный и спокойный след

Типичная схема выглядит так. При создании профиля антидетект генерирует seed — число, уникальное для этого профиля. Seed используется как основа детерминированного генератора шума: один и тот же seed всегда даёт одни и те же поправки к пикселям. При каждом вызове toDataURL() движок применяет поправки к реальному рендеру и возвращает изменённую строку. WebGL-строки RENDERER и VENDOR подменяются значениями из базы реальных GPU — так, чтобы сочетание параметров выглядело как реальное устройство.

Результат: canvas-хэш стабилен внутри профиля, уникален между профилями и соответствует реально существующему железу — только другому. Важный нюанс: если прокси и canvas-отпечаток географически не согласованы, антифрод всё равно видит несоответствие. Американский IP с canvas-хэшем от азиатского железа — это тревожный сигнал даже при идеальной подмене. О том, какой тип прокси подходит под антидетект, — в статье «Прокси для антидетект-браузеров».

Частые ошибки при защите от canvas fingerprint

Перед тем как запускать профили с подменёнными отпечатками, проверьте каждый пункт:

  • Шум генерируется случайно, а не детерминированно. Если canvas-хэш разный при каждом вызове внутри одной сессии — платформа это видит. Шум должен быть фиксированным для конкретного профиля и меняться только при его пересоздании.
  • WebGL не подменён вместе с canvas. Замена только canvas при сохранённых реальных WebGL-строках GPU даёт очевидное несоответствие. Оба параметра подменяются согласованно или не подменяется ничего.
  • Один и тот же «фейковый» GPU у всех профилей. Десять профилей подряд с одинаковым RENDERER — нереалистичная картина. У каждого профиля должен быть уникальный, но реально существующий GPU из базы устройств.
  • Прокси и canvas-хэш из разных регионов. Американский IP и GPU с характеристиками азиатского рынка — нетипичное сочетание, которое поднимает риск-скор независимо от качества подмены.
  • Расширение вместо движкового патча. Расширения обнаруживаются через chrome.runtime и timing-атаки. Для рабочего мультиаккаунтинга нужна модификация на уровне браузерного движка.
  • Результат не проверяется перед запуском. Откройте профиль в инструменте проверки отпечатков и убедитесь, что canvas-хэш разный у каждого профиля и стабилен при перезагрузке страницы.
  • Canvas игнорируется при настройке остальных параметров. Canvas fingerprint — один из самых весомых сигналов. Работать без его подмены при одновременной замене user-agent и шрифтов бессмысленно: система всё равно видит реальное железо.

Частые вопросы

Можно ли обойти canvas fingerprint с помощью VPN?

VPN меняет IP-адрес, но не влияет на canvas-хэш. Сайт получает оба параметра независимо: сначала читает пиксели из холста через JavaScript внутри браузера, потом смотрит на IP. Если canvas-хэш совпадает с ранее заблокированным профилем — VPN не поможет.

Что произойдёт, если полностью заблокировать canvas API?

Сайт получит сигнал «canvas заблокирован» — и это само по себе аномалия. Нормальный браузер без патчей никогда не блокирует canvas. Такой сигнал повышает скор подозрительности сильнее, чем просто уникальный, но реальный хэш.

Режим инкогнито скрывает canvas fingerprint?

Нет. Режим инкогнито не хранит cookie и историю после закрытия вкладки, но рендеринг canvas происходит так же, как в обычном режиме. Хэш будет идентичным — те же GPU, шрифты, движок.

Влияет ли скорость устройства на canvas fingerprint?

Нет. Canvas fingerprint зависит от пикселей, а не от времени рендеринга. Замер времени рендеринга — это отдельный метод (timing fingerprint), который иногда используется параллельно как дополнительный сигнал.

Как часто canvas fingerprint меняется сам по себе?

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

Источники

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

Читайте также

Нужна консультация?

Разберём задачу и подскажем, какой антидетект-браузер и прокси подойдут именно вам.

Связаться