Canvas-фингерпринтинг — один из самых мощных методов отслеживания. Узнайте, как он работает и как снизить риск слежки.
Canvas-фингерпринтинг работает так: браузеру предлагается нарисовать текст и фигуры на невидимом HTML5-холсте (canvas), после чего полученные пиксели считываются обратно и хешируются в короткий стабильный идентификатор. Поскольку каждое устройство отрисовывает одни и те же инструкции немного по-разному — в зависимости от GPU, графического драйвера, операционной системы и шрифтового движка — этот хеш становится тихой подписью, которая следует за вами по сайтам без всяких cookie. Эта статья выходит далеко за рамки основ: как именно расходятся пиксели, сколько уникальности добавляет canvas, как понять, что сайт снимает с вас отпечаток, и почему некоторые популярные средства защиты могут обернуться против вас.
Как на самом деле работает Canvas-фингерпринтинг
Метод опирается на элемент <canvas>, предназначенный для рисования графики с помощью JavaScript. Отслеживающему скрипту никогда не нужно показывать этот холст на экране — он целиком существует в памяти.
Последовательность действий практически одинакова во всех реализациях:
- Создать внеэкранный холст. Небольшой canvas (часто шириной 200–300 px) создаётся, но никогда не добавляется на видимую страницу.
- Нарисовать фиксированную сцену. Скрипт отрисовывает заранее заданную строку текста — нередко с разными шрифтами, цветами, одним-двумя эмодзи и перекрывающимися прямоугольниками. Эмодзи и необычный Unicode популярны, потому что заставляют шрифтовой стек ОС принимать решения об отрисовке.
- Считать пиксели обратно. Скрипт вызывает
toDataURL(), чтобы экспортировать холст как Base64-PNG, либоgetImageData(), чтобы прочитать сырой байтовый массив RGBA. - Хешировать результат. Эти байты пропускаются через хеш-функцию (обычно что-то вроде FNV или MurmurHash), что даёт компактный отпечаток, например
e3b0c44298fc1c14.
Хитрость в том, что инструкции одинаковы для всех, а результат — нет. Два посетителя, запускающие один и тот же скрипт, могут получить разные хеши, а один и тот же посетитель при каждом возвращении получает один и тот же хеш — именно это и нужно трекеру.
Холст никогда не отображается. Вы не увидите ни мерцания, ни рамки, ни какого-либо визуального признака. Именно эта незаметность сделала Canvas-фингерпринтинг таким распространённым для скрытой слежки.
Почему пиксели различаются на разных устройствах
Если рисование слова «Hello» должно быть детерминированным, почему байты вообще меняются? Несколько слоёв вашей системы по очереди вносят крошечные, но воспроизводимые вариации.
GPU и графический драйвер
Сглаживание, субпиксельный рендеринг и способ заливки кривых частично делегируются GPU. Встроенный чип Intel, GPU Apple Silicon и дискретная карта NVIDIA будут по-разному округлять пиксели на краях. Даже две машины с одинаковой моделью GPU могут расходиться, если различаются версии их драйверов.
Растеризация шрифтов
Самый весомый вклад вносит отрисовка текста. Шрифтовой движок ОС — DirectWrite в Windows, Core Text в macOS, FreeType в Linux — решает, как превратить контуры глифов в пиксели. Хинтинг, гамма-коррекция и точный алгоритм сглаживания различаются от платформы к платформе и от версии к версии, поэтому серые пиксели вдоль края буквы «g» несут на удивление много отличительной информации.
Операционная система и установленные шрифты
От того, существует ли запрошенный шрифт, зависит, подставит ли браузер запасной вариант. Эмодзи может отрисоваться плоским контуром на одной системе и полноцветным глифом на другой. Набор цветных эмодзи ОС (Apple, Noto, Segoe) оставляет особенно сильный след.
Браузерный движок и его версия
У Chromium, Firefox и WebKit своя собственная реализация canvas. Управление цветом и способ, которым toDataURL() кодирует PNG-данные, могут меняться от версии к версии браузера — поэтому обновление браузера иногда меняет ваш canvas-хеш.
Сколько уникальности добавляет Canvas?
Canvas ценен для трекеров не потому, что идентифицирует вас в одиночку, а потому что вносит значимую долю энтропии — меры того, насколько сигнал сужает круг того, кто вы есть. В исследованиях фингерпринтинга «в дикой природе» canvas неоднократно оказывался среди отдельных сигналов с самой высокой энтропией, которые может прочитать пассивный сайт, наравне с полным списком установленных шрифтов.
При этом canvas редко идентифицирует человека сам по себе. Многие люди используют одинаковые конфигурации — стоковый ноутбук на Windows с Chrome и шрифтами по умолчанию совпадёт с миллионами других. Его настоящая сила проявляется в сочетании: canvas вместе с WebGL, параметрами экрана, часовым поясом и языком вместе подталкивают к почти уникальному отпечатку. Для более полной картины того, как эти сигналы складываются, см. наше полное руководство по фингерпринтингу браузера.
| Свойство | Canvas-фингерпринтинг |
|---|---|
| Требуется хранилище | Нет (ни cookie, ни localStorage) |
| Переживает очистку кеша/cookie | Да |
| Переживает режим инкогнито/приватный | Обычно да |
| Виден пользователю | Нет |
| Типичный вклад в энтропию | Высокий среди одиночных пассивных сигналов |
| Побеждается очисткой данных | Нет |
| Побеждается сменой IP | Нет |
Как сайты используют Canvas-отпечатки
Canvas-фингерпринтинг — палка о двух концах. Один и тот же механизм служит как вторгающимся, так и защитным целям:
- Межсайтовое отслеживание. Рекламные и аналитические сети, встроенные на множество сайтов, читают canvas-хеш, чтобы узнать вернувшегося посетителя даже после очистки cookie, выстраивая поведенческий профиль.
- Защита от мошенничества и безопасность аккаунтов. Банки и платёжные системы помечают входы, где canvas-отпечаток вдруг отличается от известного устройства, помогая выявлять захват аккаунтов.
- Обнаружение ботов и злоупотреблений. Headless-браузеры и фреймворки автоматизации часто выдают canvas-результаты, которые либо слишком однородны, либо отрисовываются характерным образом, поэтому фингерпринтинг помогает отделить реальных пользователей от скриптового трафика — о том, как это работает на практике, см. Методы обнаружения ботов.
- Ограничение частоты запросов и предотвращение злоупотреблений. Сервисы используют отпечаток как стабильный ключ, чтобы притормозить аккаунты, обходящие лимиты с помощью свежих cookie.
Как определить, снимают ли с вас Canvas-отпечаток
Сам холст вы не увидите, но можете отслеживать поведение, которое его сопровождает.
Следите за вызовами API
При попытке фингерпринтинга JavaScript вызывает getContext('2d'), затем fillText(), затем toDataURL() или getImageData() на холсте, который никогда не добавляется на видимую страницу. Инструменты разработчика браузера и некоторые расширения для приватности могут выявить эти вызовы.
Минимальный перехватчик для обнаружения
Вы можете сами инструментировать canvas API, чтобы логировать подозрительные считывания:
// Обнаружение скриптов, которые читают пиксели холста, ничего не отображая
(function watchCanvasReads() {
const origToDataURL = HTMLCanvasElement.prototype.toDataURL;
const origGetImageData = CanvasRenderingContext2D.prototype.getImageData;
HTMLCanvasElement.prototype.toDataURL = function (...args) {
if (!document.body.contains(this)) {
console.warn('[canvas-fp] toDataURL() on an off-screen canvas', this);
}
return origToDataURL.apply(this, args);
};
CanvasRenderingContext2D.prototype.getImageData = function (...args) {
console.warn('[canvas-fp] getImageData() reading pixels back', this.canvas);
return origGetImageData.apply(this, args);
};
})();
Если вы предпочитаете увидеть свой собственный отпечаток, а не читать код, проще всего запустить инструмент детектирования отпечатка от BrowserInsight. Он вычисляет ваш живой canvas-хеш, показывает рядом сигналы WebGL и аудио и оценивает, насколько уникален ваш общий отпечаток.
Способы защиты и их компромиссы
Идеальной защиты не существует, и — что важно — некоторые популярные варианты могут сделать вас более узнаваемым. Вот как соотносятся основные подходы.
Единообразие (подход Tor Browser)
Стратегия Tor Browser — сделать так, чтобы все пользователи выглядели одинаково. По умолчанию он отключает считывание canvas и запрашивает разрешение перед тем, как его допустить, так что скрипт получает либо пустой результат, либо значение, общее для всей популяции Tor. Слиться с большой однородной толпой — самая надёжная защита, но цена этого — сильно стандартизированный, порой ограничивающий опыт работы в браузере.
Рандомизация (farbling в Brave)
Brave идёт другим путём, который называется farbling: он добавляет небольшой шум — для каждой сессии и каждого домена — в считывание canvas, так что ваш отпечаток меняется на каждом сайте и в каждой сессии. Это эффективно ломает межсайтовую связку. Тонкий риск в том, что сам факт рандомизации поддаётся обнаружению — и наивно реализованная рандомизация может парадоксальным образом добавить энтропии, ведь «браузер, у которого canvas зашумлён» — уже отличительная черта. Хорошо спроектированный farbling держит шум малым и правдоподобным, чтобы избежать этой ловушки. Подробнее о том, почему дизайн шума определяет, помогает ли рандомизация или вредит, — в статье Canvas-шум против хеша: почему рандомизация даёт осечку.
Блокирующие расширения (CanvasBlocker)
Расширения вроде CanvasBlocker могут блокировать считывание, возвращать поддельное значение или рандомизировать его для каждого домена. Они дают тонкий контроль, но действует та же оговорка: необычная или чрезмерно агрессивная подмена может выделяться, а плохо настроенный блокировщик может оказаться более сильным сигналом, чем тот canvas, который он скрывает.
Отключение JavaScript
Отключение JavaScript (через NoScript или подобное) полностью побеждает Canvas-фингерпринтинг, потому что API просто не может выполниться. Компромисс суров — большинство современных сайтов без него ломаются — поэтому это подходит лишь для самых чувствительных к безопасности сценариев.
| Защита | Как работает | Главный компромисс |
|---|---|---|
| Единообразие Tor Browser | Все выглядят одинаково | Ограниченный, стандартизированный опыт |
| Farbling в Brave | Посессионный шум ломает связку | Рандомизация поддаётся обнаружению |
| CanvasBlocker | Блокировка/подмена/рандомизация считывания | Неверная настройка может обернуться против вас |
| Отключение JavaScript | API никогда не запускается | Ломает большинство сайтов |
Часто задаваемые вопросы
Удаляет ли очистка cookie мой canvas-отпечаток?
Нет. Canvas-фингерпринтинг ничего не хранит на вашем устройстве — он выводит идентификатор из того, как ваше железо и софт отрисовывают графику. Очистка cookie, кеша или данных сайта на него никак не влияет.
Останавливает ли приватный режим или инкогнито Canvas-фингерпринтинг?
Обычно нет. Приватные окна изолируют cookie и историю, но ваши GPU, драйверы и шрифты остаются прежними, поэтому canvas-хеш, как правило, такой же, как в обычном окне. Приватный режим помогает против отслеживания на основе хранилища, но не против фингерпринтинга.
Может ли сайт увидеть, что я использую блокировщик canvas?
Иногда да. Если ваш canvas возвращает очевидно поддельное, пустое или зашумлённое значение, изощрённый скрипт может сделать вывод, что активна защита. Именно поэтому единообразие (выглядеть как все) часто надёжнее рандомизации (выглядеть нарочито иначе).
Canvas-фингерпринтинг — это то же самое, что WebGL-фингерпринтинг?
Они связаны, но различны. Canvas читает 2D-отрисовку текста и фигур; WebGL зондирует ваш GPU через 3D-рендеринг и напрямую раскрывает строки производителя и рендерера. В составном отпечатке они дополняют друг друга — наш подробный разбор WebGL-фингерпринтинга детально освещает 3D-сторону.


