Отчёт BrowserLeaks Canvas: сигналы и ограничения
Разберите проверки Canvas, PNG, digest и поиск сигнатуры в BrowserLeaks, не принимая их за идентификацию или вердикт.
BotBrowser Team
Нужна структурированная документация по теме Отпечатки?
Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.
BotBrowser может сохранять согласованность заявленного профиля браузера при разрешённой проверке Canvas, но не может объяснить сторонний отчёт или превратить его в решение сайта о боте. На странице Canvas в BrowserLeaks рядом показаны разные виды данных: доступность API, digest одного фиксированного рисунка, поиск в собственном наборе сигнатур и сведения о PNG-файле. Если читать все строки как единый балл, теряется понимание того, какая операция дала каждый результат и что именно установила страница.
TL;DR
- BrowserLeaks отдельно проверяет Canvas 2D, отрисовку текста и экспорт PNG через data URL перед показом раздела сигнатур.
- Публичный скрипт рисует шаблон размером
220×30, кодирует PNG, вычисляет MD5 digest из декодированных байтов и запрашивает/api/canvas/<digest>. - Процент с меткой
Uniquenessрассчитывается поcountиtotalиз ответа; публичная страница не указывает выборочную совокупность или период сбора данных. - Размер файла в байтах, число цветов, PNG-чанки и CRC описывают одно и то же изображение, а не четыре независимые идентичности браузера.
- Отсутствие записи, общий digest, ошибка проверки возможности и изменившийся digest могут иметь разные причины. Ни один из этих случаев сам по себе не определяет человека и не доказывает, что браузер является ботом.
Содержание
- Разделить уровни отчёта
- Проследить вычисление сигнатуры
- Интерпретировать отображаемый процент Uniqueness
- Отдельно изучить сведения PNG
- Вести запись контролируемого сравнения
- Практический вывод
Разделить уровни отчёта
Публичная страница объединяет результаты разных операций. Проверка возможности отвечает, доступна ли конкретная операция; поиск сигнатуры отвечает, соответствует ли результат отрисовки ключу в ответе сервиса. В обзоре Canvas fingerprinting объясняется, как рисунок и чтение пикселей могут формировать сигнал. Здесь публичные идентификаторы и скрипт BrowserLeaks помогают отделить панели, относящиеся к этому сигналу.
| Область отчёта | Видимая операция | Ограниченный вывод | Чего она не доказывает |
|---|---|---|---|
| Строки поддержки | Контекст Canvas 2D, отрисовка текста и проверка PNG toDataURL() | Прошли ли эти конкретные операции свои проверки | Что доступны все функции Canvas или что браузер принадлежит человеку либо автоматизации |
| Сигнатура | Фиксированный рисунок кодируется, а его байты сводятся к значению MD5 | Ключ, используемый этой страницей для поиска сигнатуры | Личность человека, совпадение аккаунта или универсальный идентификатор браузера |
| Статистика сигнатуры | Ответ содержит count, total, а также метки браузера и ОС | Как текущий ответ сервиса описывает совпавший ключ | Исходную совокупность, период сбора или измеренную вероятность бота |
| Сведения об изображении | Цвета пикселей и PNG-чанки созданного файла разбираются отдельно | Свойства файла, созданного этим рисунком | Независимые отпечатки, не связанные с сигнатурой выше |
В разметке страницы отдельные идентификаторы назначены canvas-support-2d, canvas-support-text и canvas-support-todataurl. Сигнатура и текст о совпадающих сигнатурах также размещены отдельно, как и размер файла, число цветов и таблица PNG-чанков. Поэтому исходный код задаёт проверяемую границу между доступностью функции и ответом набора данных; единая трактовка зелёного или красного результата эту границу стирает.
Строка canvas-support-todataurl не даёт полного диагноза сбоя. Сравнение состояний экспорта Canvas разделяет data:,, синхронный SecurityError и успешную замену на PNG до интерпретации хеша изображения.
Такое разделение полезно и при сравнении публичных тестовых наборов. В статье Что на самом деле проверяют публичные detector suites проверки страницы отделяются от проверок соединения по разделам самих наборов. Canvas-страница BrowserLeaks относится к наблюдениям внутри страницы: она проверяет собственный JavaScript-рисунок и экспорт изображения, а не TLS, маршрут прокси или решение приложения об аккаунте.
Проследить вычисление сигнатуры
Опубликованный canvas.js задаёт ширину 220 и высоту 30. Он рисует цветной прямоугольник, а затем записывает буквальную строку BrowserLeaks,com <canvas> 1.0 в двух близких позициях с разными стилями заливки. Код также меняет базовую линию текста и настройки шрифта. Эти значения задают вход именно этой проверки, а не универсальный эталон Canvas. Другой текст, доступность шрифтов, стек рендеринга или размер образовали бы другой вход.
Затем скрипт запрашивает PNG data URL через toDataURL('image/png'). Он проверяет ожидаемый префикс PNG data URL, декодирует Base64-часть в байты, вычисляет MD5 этих байтов и показывает digest. После этого скрипт запрашивает /api/canvas/<digest> и использует поля ответа для заполнения статистики сигнатуры. Эти шаги видны в открытом исходном коде; они не означают, что запускалась сессия BotBrowser или что digest был получен при запуске браузера.
У этой цепочки есть несколько границ. Во-первых, ключ охватывает байты одного конкретного рисунка и пути кодирования, а не все операции Canvas, доступные странице. Во-вторых, здесь MD5 служит компактным ключом поиска; его наличие не шифрует изображение и не гарантирует приватность. В-третьих, ответ по digest описывает данные сервиса, а не логику совпадений другого сайта. Сайт может использовать другие рисунки, сочетать другие сигналы или вообще не использовать Canvas.
Последовательность, выведенную из исходника, можно записать, не сохраняя само изображение:
| Этап | Что записать | Граница интерпретации |
|---|---|---|
| Страница и скрипт | URL и дату получения | Реализация может измениться; не переносите вывод на незакреплённую версию |
| Вход рисунка | 220×30, текст, шрифт, базовую линию, заливки и позиции | Изменение входа не доказывает изменение рендерера |
| Экспорт | Принят ли PNG data URL | Экспорт не равен доступности другого API Canvas |
| Digest | Был ли показан digest, без исходного изображения | Digest служит ключом результата, не идентификатор пользователя |
| Поиск | Ответ найден, запись отсутствует или запрос недоступен | Отсутствующая строка не является отрицательной классификацией автоматизации |
Другие проекты также создают пиксели, но применяют собственную рецептуру. Разбор цикла Canvas seed в CreepJS отслеживает заданную исходником последовательность значений; её seed и число циклов не заменяют фиксированный рисунок BrowserLeaks.
Интерпретировать отображаемый процент Uniqueness
Если ответ API содержит совпавшую запись, скрипт считывает count и total. Он показывает процент, вычисленный как floor(100 × (100 − 100 × count / total)) / 100, и выводит исходные счётчики в формулировке «count of total user agents have the same signature». Эта арифметика дополняет долю совпадений в ответе. Это не вероятность уникальности текущего посетителя и не калиброванная оценка того, как detector оценит сессию.
Исходник не указывает, как выбирались user agents ответа, какие версии браузеров представлены, удалялись ли дубликаты и когда собирались счётчики. Без этих данных нельзя установить репрезентативность знаменателя. Корректнее сказать: «текущий ответ сообщает эту долю для своего набора user agents», а не «этот браузер уникален среди всех пользователей». Если запись не найдена, страница помечает сигнатуру как отсутствующую в списке; это не доказывает, что рендеринг редок или нов.
Показываемые названия браузера и операционной системы также приходят из ответа. Код записывает response[digest].browser[0][0] и response[digest].os[0][0] в элементы страницы. Эти метки описывают запись, связанную с ключом, а не напрямую считанное физическое устройство. Они могут помочь понять группировку сервиса, но не подтверждают компьютер, профиль, пользователя или приложение, отправившее запрос.
Для анализа приватности отдельно важен путь запроса. Страница отправляет digest на собственный маршрут /api/canvas/, чтобы получить статистику. Digest в URL остаётся данными запроса и может попасть в серверные журналы или промежуточную телеметрию. Короткое представление изображения не делает запрос анонимным. Не следует передавать публичной диагностической странице изображение чувствительного приложения или данные клиента. Результат основан на фиксированном тестовом рисунке BrowserLeaks, его нужно отделять от закрытых Canvas-данных приложения.
Отдельно изучить сведения PNG
Панель изображения исследует тот же PNG, который создаётся на этапе сигнатуры. Скрипт показывает предварительный просмотр, сообщает размер закодированного файла в байтах и вызывает getImageData(0, 0, 220, 30), чтобы посчитать различные значения пикселей в прямоугольнике. Байты PNG также передаются анализатору, который перечисляет имена чанков, длины, CRC и выбранное содержимое. Разметка страницы называет эти строки “File Size”, “Number of Colors” и “PNG Headers”.
Такие сведения помогают разбирать различия экспорта или кодирования изображения. Если размеры двух файлов отличаются, таблица чанков помогает проверить контейнер до предположения об изменении пикселей. Если изменилось количество цветов, могли измениться рисунок или значения пикселей. Но метаданные не являются независимым свидетельством второго свойства устройства: размер, цвета, структура чанков и MD5 происходят из одного изображения. Подсчёт каждого как отдельного совпадения превратил бы одно наблюдение в несколько кажущихся сигналов.
Стандарт API описывает toDataURL() как способ вернуть data URL изображения Canvas и документирует условия, влияющие на результат, включая чистоту происхождения. Видимая строка BrowserLeaks ограничена собственной проверкой экспорта PNG. Она не сообщает все возможные причины ошибки и не проверяет все источники, изображения, контексты или политики браузера. Следует различать «проверка этой страницы не вернула ожидаемый PNG data URL» и более широкое утверждение «Canvas отключён».
Вести запись контролируемого сравнения
Для воспроизводимого сравнения нужны входные данные и версия страницы, а не только снимок результата. Запишите URL BrowserLeaks, дату получения, сборку браузера, профиль операционной системы, результаты трёх проверок возможностей и наличие записи после поиска сигнатуры. При повторном использовании страницы сохраняйте условия до сравнения digest. Не меняйте одновременно профиль, сборку браузера, набор шрифтов, viewport и графический путь, а затем не приписывайте результат одному фактору.
| Наблюдение | Что записать дальше | Чего не следует заключать |
|---|---|---|
| Нет поддержки 2D | Сборку браузера, ошибку страницы и факт возврата контекста 2D | Что недоступны все рисунки или всё Canvas fingerprinting |
| Отличается поддержка текста | Точную строку проверки и использованные сборку/профиль | Что это различие само по себе является сигналом автоматизации |
| PNG-экспорт не принят | Вернула ли toDataURL('image/png') ожидаемый префикс и видимую ошибку | Что в браузере отсутствует реализация Canvas |
| Для digest есть статистика | Значения count и total и дату источника | Что процент описывает весь Интернет или вероятность бота |
| Для digest нет строки статистики | «Нет совпавшей записи в ответе» и версию страницы | Что digest новый, уникальный или подозрительный |
| Отличаются сведения PNG | Размер файла, число цветов и изменившиеся чанки | Что каждое поле является независимым отпечатком |
Эта запись намеренно уже полного fingerprint-профиля. Она помогает уполномоченной команде повторить публичную проверку без хранения исходных пикселей и без превращения отдельного результата в вердикт. Стабильный digest при неизменных условиях означает, что ключ не изменился; для доказательства идентичности закодированных байтов нужно побайтовое сравнение. Это не доказывает стабильность всех поверхностей страницы. Отличающийся digest сообщает только об изменении выходного ключа; таблица выше помогает сравнить условия до поиска причины.
FAQ
Означает ли общий digest, что два наблюдения относятся к одному человеку?
Нет. Это означает, что фиксированный рисунок дал одинаковый ключ в сравниваемых наблюдениях. Обычные варианты рендеринга могут иметь общий результат, а один человек может получить другой результат после изменения браузера, шрифтов, ОС или рендеринга. Поиск сервиса не устанавливает, кто отправил запрос.
Измеряет ли процент анонимность?
Нет. Формула получена из count и total в ответе сервиса. Публичная страница не описывает выборочную совокупность или период, поэтому по ней нельзя оценить анонимность всей популяции.
Возвращает ли BrowserLeaks решение о боте?
Canvas-страница показывает поддержку, сигнатуру и результат поиска. В публичной разметке нет вердикта о боте. Другой сервис может объединять иные данные, но этот отчёт этого не устанавливает.
Если поиск не завершился
Публичный скрипт различает отсутствие записи и сбой запроса. Если для ключа digest нет записи или её значение равно not_listed, скрипт не заполняет статистику сигнатуры. Отклонённый запрос или ошибка разбора ответа попадает в ветку, которая показывает “Data retrieval error” и предлагает повторить запрос. Обработчик отменяет переход по ссылке по умолчанию, показывает загрузку и запускает проверку снова. Это состояния сервиса и запроса, а не новые проверки возможностей Canvas.
Проверка возможностей также имеет ограниченную логику. Сначала страница проверяет контекст 2D, затем fillText, после чего выясняет, возвращает ли toDataURL('image/png') строку с ожидаемым префиксом. Если тестовый рисунок вызывает исключение, скрипт создаёт другой Canvas и повторяет рисунок; второй сбой помечает локальную проверку как неуспешную. Видимые строки не показывают, какое исключение произошло, поэтому False ограничивает результат этим путём кода. По этому результату нельзя установить причину: политику происхождения, ошибку страницы, конфигурацию браузера или реализацию.
Это различие меняет следующий шаг диагностики. Для not_listed сохраните факт отсутствия записи и сравнивайте тот же фиксированный рисунок только тогда, когда вопрос касается воспроизводимости. Для “Data retrieval error” сначала проверьте доступность запроса и ответ публичного сервиса. При сбое строки поддержки запишите, какая из трёх проверок не прошла, и точную сборку браузера; не подменяйте страницу другим тестом, называя результат воспроизведением BrowserLeaks. Успешная повторная попытка означает, что предыдущий поиск не завершился, а не то, что Canvas изменился.
Страница также запрашивает API, помещая digest в путь. При анализе приватности этот запрос следует рассматривать отдельно от локальной отрисовки: при поиске сервер получает стабильный ключ именно для этого шаблона. Публичный исходник показывает форму маршрута, но не описывает хранение, журналы или контроль доступа на сервере. Нельзя предполагать ни что значение остаётся только в браузере, ни что оно используется для связывания действий между сайтами: видимого кода недостаточно для таких выводов.
Публичные источники
- Страница Canvas-тестов BrowserLeaks
- Скрипт Canvas BrowserLeaks
- MDN:
HTMLCanvasElement.toDataURL() - Раздел Canvas стандарта HTML WHATWG
- Документация Canvas BotBrowser
- Справочник согласованности автоматизации BotBrowser
Практический вывод
Рассматривайте Canvas-страницу BrowserLeaks как документированную проверку с отдельными результатами: возможность, созданное изображение, поиск сигнатуры и разбор PNG. Указывайте знаменатель и дату источника при обсуждении процента, а отсутствие записи описывайте именно как отсутствие, а не вердикт. Digest помогает повторить фиксированный рисунок страницы; метки сервиса не подтверждают личность и не решают, является ли доступ автоматизированным.
Эта статья входит в руководство: Что такое отпечаток браузера?
Похожие статьи
Отчёт BrowserLeaks WebGL: сбор и отсутствующие данные
ОтпечаткиCanvas-отпечаток: пустой экспорт и ошибки
ОтпечаткиОтчёт CreepJS WebGL: контексты и сигналы
ОтпечаткиОтчёт EFF Cover Your Tracks: как его читать
ОтпечаткиЧто на самом деле проверяют публичные наборы тестов
ОтпечаткиДетект безголового режима в CreepJS: три отдельных вердикта
Переведите BotBrowser из исследований в продакшн
Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.