Canvas и WebGL: почему «добавить шум» часто недостаточно

Canvas и WebGL: почему «добавить шум» часто недостаточно

27.05.2026

Canvas и WebGL часто представляют как простую кнопку в антидетект‑браузере: включил шум — получил новый отпечаток и пошёл работать. На деле всё сложнее. Сайты используют отпечатки Canvas и WebGL потому, что они отражают не только особенности браузера, но и весь процесс формирования изображения системой — от видеокарты и драйверов до ОС, шрифтов и параметров рендеринга. Именно эта комбинация позволяет им отличать устройства друг от друга и проверять подлинность среды. Но нужно знать и понимать что сгенерированная картинка может быть на 100% такой же как у видео-карты из такой же серии. Например: Nvidia GeForce RTX 4060 может создавать то же самое, что Nvidia GeForce RTX 5080 – тут серии разные, но работает одинаково. Также стоит сказать, что две видео карты с одинаковым названием, могут генерировать немного разные картинки.

Исследователи писали об этом ещё в работе Pixel Perfect: Fingerprinting Canvas in HTML5: один и тот же тест на Canvas/WebGL дает стабильный результат на одной и той же связке браузера, ОС и графики. Tor Browser в своей документации тоже называет Canvas одним из заметных рисков для fingerprinting и объясняет, что хеш отрисованной картинки может работать почти как трекинг куки, если его ничем не ограничивать: The Design and Implementation of the Tor Browser.

Главная мысль: проблема не в самом факте «у меня есть фиксированный или даже уникальный Canvas». Проблема в том, когда отпечаток выглядит неестественно, меняется хаотично или конфликтует с остальными параметрами профиля. То есть, не соотвествует такому же Canvas, созданному на идентичной конфигурации ОС, шрифты, видео-карта.

Что сайт получает через Canvas

Canvas — это обычный HTML API для рисования. Сайт может создать невидимый пользователю canvas, нарисовать на нём текст, фигуры, градиенты, эмодзи, линии с разным сглаживанием, а потом использовать результат.

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

Почему у людей получаются разные значения:

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

Это не означает, что сам по себе Canvas всегда даёт уникальный отпечаток для конкретного человека. Но он добавляет ещё один слой данных к общей картине — вместе с User‑Agent, параметрами экрана, таймзоной, языком и WebGL — в совокупности эти элементы позволяют сайтам отличать разные устройства и проверять, насколько среда реальна или подменена.

Что добавляет WebGL

WebGL похож на Canvas, но работает через графический пайплайн. Сайт может не только отрисовать картинку и сравнить пиксели, но и запросить параметры графики: поддерживаемые расширения, лимиты, точность шейдеров, соответствие vendor/renderer.

Для антифрода тут важен не один параметр, а согласованность. Если профиль говорит «обычный Chrome на macOS», а WebGL выглядит как серверный Linux с программным рендерером, это заметно. Если User-Agent заявляет одно устройство, а графический стек похож на другое, это тоже не выглядит органично.

Почему простой JS-шум может палить сильнее, чем помогать

Самый простой способ «защитить» Canvas — перехватить методы вроде HTMLCanvasElement.prototype.toDataURL и подменить результат через JavaScript. Так работают многие JS расширения и самодельные патчи: сайт просит картинку, скрипт чуть меняет пиксели или возвращает заранее подготовленный ответ.

Проблема в том, что такая подмена тоже видна.

Сайт может проверять не только итоговый хеш, но и поведение функций. Например, у нативных функций в JavaScript есть характерное представление через Function.prototype.toString(); MDN показывает, что встроенные функции возвращают строку с [native code]: Function.prototype.toString(). Если метод переопределён неаккуратно, это видно сразу.

Хороший практический разбор есть у Castle: они показывают, как canvas-noise часто реализуется через перехват toDataURL, и какие проверки помогают заметить подмену: Detecting noise in canvas fingerprinting.

Постоянно меняющийся Canvas не гарантирует, что браузер пользователя вне подозрений. Иногда, наоборот сайты видят нестандартное поведение: браузер отличается от обычного Chrome и работает с изменёнными нативными API.

Уникальный отпечаток — не всегда хороший отпечаток

В антидетект-маркетинге часто звучит фраза «100% уникальный fingerprint». Звучит красиво, но для доверия это сомнительная цель.

Сайтам важна не уникальность ради уникальности. Им важны стабильность, правдоподобие и соответствие ожидаемым кластерам устройств. Обычный пользователь редко выглядит как случайно собранный набор параметров: один GPU от Windows-ноутбука, шрифты от Linux, таймзона из одной страны, язык из другой, WebGL-рендерер от третьей.

Исследование Hiding in the Crowd хорошо показывает логику «толпы»: авторы собрали более 2 млн браузерных отпечатков и обнаружили, что не все отпечатки уникальны. Но они также отмечают важную вещь: если у неуникального отпечатка меняются отдельные признаки, он с большой вероятностью становится уникальным. Для антидетекта это прямой урок: ломать один параметр без согласования с остальными опасно.

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

Какой подход выглядит нормальнее

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

Нормальный Canvas/WebGL-профиль должен быть:

  • стабильным внутри одного профиля;
  • согласованным с ОС, браузером, GPU, экраном, шрифтами и языком;
  • достаточно распространённым, чтобы не быть экзотикой;
  • без грубых JS-хуков, которые сайт может увидеть изнутри страницы;
  • предсказуемым: если шум используется, он не должен прыгать хаотично между двумя вызовами одного и того же теста.

Кстати, крупные privacy-браузеры тоже не сводят защиту к «рандому на каждый пиксель». Brave описывает свой подход как randomization-защиту с seed на профиль и сайт, чтобы значения были стабильны там, где это нужно: Fingerprinting defenses 2.0. Это не антидетект-инструкция, а хороший пример инженерной логики: защита должна уменьшать связность, но не превращать браузер в набор случайностей.

Как мы подходим к этому в 0detect

В 0DETECT мы исходим из простой идеи: Canvas и WebGL нельзя рассматривать отдельно от всего профиля. Недостаточно «поменять хеш». Браузер должен выглядеть как реальная, цельная среда.

Это видно и в нашей документации по созданию профиля. Мы описываем профиль как “автоматически сформированную коллекцию отпечатков, собранных с реальных устройств”, а не как набор случайных значений: Создание профиля.

В общих настройках профиля мы задаём не только User-Agent и версию браузера. Там же находятся ОС, версия релиза, разрешение экрана, масштабирование, имя устройства, MAC-адрес, шрифты, язык, часовой пояс и геолокация. Часть этих параметров по умолчанию подбирается с учётом внешнего IP: например, язык, таймзона и координаты. Это важно: графический отпечаток не должен жить отдельно от географии, сети и платформы.

В блоке “Оборудование” мы отдельно показываем, что Canvas/WebGL связаны с аппаратной частью профиля: CPU cores, RAM, видеокарта, звуковая карта, WebGL, Canvas, Client Rects и медиа-устройства.

Видеокарту и её параметры мы эмулируем на основе реальных отпечатков устройств пользователей. WebGL получает аппаратный шум, имитирующий естественные реальные устройства. Canvas получает аппаратный шум в отрисовке, чтобы скрывать реальные графические характеристики устройства. Это лучше описывает задачу, чем фраза “просто сделать новый Canvas-хеш”.

Поэтому для нас важны три вещи.

Первая — согласованность. WebGL renderer, Canvas, шрифты, экран, ОС, User-Agent, язык и сеть должны складываться в одну историю. Если профиль выглядит как MacBook, он не должен отдавать сигналы, характерные для серверного Linux.

Вторая — стабильность. Один и тот же профиль не должен каждый раз превращаться в новое устройство. Для антифрод-системы резкая смена графического отпечатка внутри привычного аккаунта выглядит не как приватность, а как риск.

Третья — минимизация видимых следов подмены. Чем больше логики вынесено в JS-инъекции на странице, тем больше вероятность быть скопроментированным. Если ваш антидетект браузер делает подмены внутри кода, таким образом не остаётся следов в JavaScript-окружении.

Recent Articles

Make your work fast and secure with 0DETECT Browser

Want to stay up to date with all news, discounts, promotions? Sign up for our newsletter and be the first to receive the latest information
Follow us on Social Media
Explore 0DETECT Browser