Назад в Центр знаний
Отпечатки

Canvas-отпечаток: пустой экспорт и ошибки

Чем пустой результат data:, запасной формат PNG и SecurityError отличаются от различий пикселей при проверке Canvas-отпечатка.

BotBrowser Team

Документация

Нужна структурированная документация по теме Отпечатки?

Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.

Проверка Canvas-отпечатка может не получить изображение ещё до появления пиксельного результата для сравнения. BotBrowser документирует управление шумом Canvas и --bot-noise-seed для согласованного вывода. Эта конфигурация не гарантирует, что экспорт завершился, использовался запрошенный кодировщик или выполнялось требование origin-clean. Поэтому отсутствие хеша требует записи состояния экспорта, а не немедленного объяснения через идентичность браузера.

Кратко

  • data:, обозначает пустой результат, а не пустой PNG. Нулевое значение хотя бы одного измерения растрового изображения и сбой сериализации могут дать одинаковое значение.
  • MDN также описывает data:, при превышении ограничения размера Canvas в реализации. Строка не определяет конкретную причину.
  • Если растровое изображение не является origin-clean, возникает синхронный SecurityError; эта проверка предшествует проверке нулевых размеров.
  • Неподдерживаемый запрошенный формат может успешно заменяться PNG. Результат PNG не доказывает работу запрошенного кодировщика.
  • У toBlob() другая форма результата: немедленно возвращается undefined, а обратный вызов получает Blob или null. Исключение безопасности остаётся синхронным.

Содержание

Состояния экспорта Canvas разделяют синхронный SecurityError, data:, или null в обратном вызове и успешный переход к PNG.

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

Интерпретация результата экспорта

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

Стандарт HTML определяет toDataURL() как сериализацию растрового изображения Canvas. Обычно возвращается URL данных с закодированным изображением, но точная строка data:, тоже предусмотрена стандартом. Этот кратчайший URL представляет пустой текстовый ресурс. В нём нет ни сигнатуры PNG, ни доказательства кодирования непустого изображения. Название «пустая картинка» смешивает отсутствие закодированного изображения с корректным изображением, пиксели которого прозрачны.

Вход или этапРезультат toDataURL()Результат toBlob()Что установлено
Растровое изображение не origin-cleanСинхронный SecurityErrorСинхронный SecurityErrorПри экспорте не выполнено условие безопасности
Один из размеров равен нулюdata:,Обратный вызов получает nullПо этому пути изображение не сериализовано
Сериализация не возвращает файлdata:,Обратный вызов получает nullКодировщик не предоставил файл изображения
Запрошенный тип не поддерживается, кодирование успешноURL данных PNGPNG BlobУспешно выполнено кодирование в запасной формат
Запрошенный тип поддерживается, кодирование успешноURL данных изображенияBlob изображенияСоздано закодированное представление

MDN добавляет случай, зависящий от реализации: toDataURL() возвращает data:,, если ширина или высота превышает максимальный размер Canvas. Этот максимум не является переносимой константой. Запись только с пустым результатом не отличает такой случай от нулевого значения хотя бы одного измерения или сбоя сериализатора. Следующими полезными данными будут фактические размеры растрового изображения и этап экспорта, а не предполагаемое графическое устройство.

Разбор отчёта Canvas BrowserLeaks прослеживает конкретный путь PNG и хеширования. Видимый показатель поддержки не является полным отчётом об исключениях. Документированные состояния экспорта разделяют результаты, которые такой показатель может объединять; они не доказывают, что BrowserLeaks показывает каждый результат или сохраняет первоначальную причину сбоя.

Размеры, чистота и порядок исключений

Растровое изображение Canvas и CSS-прямоугольник отображения элемента являются разными объектами. Атрибуты width и height определяют размеры растра; CSS может менять масштаб показа. Большой прямоугольник на снимке не доказывает большой размер закодированного растра. И наоборот, небольшой элемент может сериализовать гораздо больше пикселей, чем следует из его видимой области. Сравнение только по снимкам способно объединить разные растровые входы, назвав их одинаковой конфигурацией сравнения.

Нулевой размер также отличается от рисунка, на котором ничего не нарисовано. Ненулевой растр может содержать прозрачные пиксели и сериализоваться в изображение. Случай data:, связан с отсутствием пикселей по одному из измерений или невозможностью получить сериализованный файл, а не с визуальной содержательностью рисунка. Это различие не позволяет ошибочно объединить прозрачный Canvas и Canvas нулевого размера в отчёте о совместимости.

Флаг origin-clean является ещё одним независимым входом. Оба алгоритма экспорта сначала проверяют его. При ложном значении они выбрасывают SecurityError до последующих этапов сериализации. Порядок важен, если у растра есть и другое проблемное свойство: перехваченное исключение безопасности нельзя переименовать в результат нулевого размера. Приложение, записывающее только «Canvas недоступен», теряет сведения о реально остановившейся операции.

MDN описывает условие безопасности через растр, содержимое которого получено или могло быть получено из другого источника происхождения. Это не диагноз конкретного запроса изображения. Исключение не раскрывает полную историю рисования, повлиявший ресурс или заголовки ответа. Журналы собственного приложения позволяют исследовать эти входы, но публичная панель отпечатка не может вывести их из одной метки ошибки.

Изменение отображения элемента не доказывает, что его растр стал origin-clean. Размеры CSS и флаг безопасности относятся к разным частям модели. Аналогично, корректный URL изображения в документе сам по себе не доказывает возможность включить изображение в читаемый вывод Canvas. Показ ресурса и экспорт производных от него пикселей являются разными разрешениями и операциями. Диагностическая запись должна сохранять исключение экспорта, а не считать успешный показ гарантией успешного экспорта.

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

Запрошенные форматы и сериализация

Запрошенный MIME-тип является входом, а не гарантией выходного представления. Правила HTML требуют поддержку PNG и определяют переход к PNG при неподдерживаемом запрошенном типе. Тип с параметрами также считается неподдерживаемым. Получение непустой строки не позволяет вызывающему коду, ожидающему JPEG, заключить, что использовался именно JPEG. Существенными данными являются тип содержимого URL данных или тип полученного Blob.

Это важно до сравнения закодированных значений. Две операции экспорта могут представлять эквивалентный рисунок в разных форматах и потому иметь разные байты. Даже при неизменном формате хеш закодированных байтов описывает эти байты, но не доказывает, что два декодировщика показали бы разные пиксели. Общий процесс Canvas-отпечатка включает рисование и чтение; сравнение закодированных файлов добавляет решения сериализации, которые нельзя молча приписывать только графической поверхности.

Необязательный аргумент quality относится к форматам со сжатием с потерями. MDN описывает числа от 0 до 1; при пропуске значения или выходе за этот диапазон пользовательский агент использует качество по умолчанию. Число вне диапазона не определяет отдельную ветвь ошибки качества, хотя размеры, origin-clean или сериализация всё ещё могут привести к сбою. Формат, не использующий настройку качества, не приобретает её из-за переданного аргумента. Поэтому запрос значения не доказывает, что PNG использовал его или что все реализации одинаково настроили кодировщики. Запрошенные тип и качество нужно хранить отдельно от возвращённого типа, чтобы не принять проигнорированный вход или запасной формат за изменение рендеринга.

Метаданные разрешения задают ещё одну границу. Документация описывает 96dpi для форматов, позволяющих кодировать такие метаданные. Это данные файла, а не измерение физического экрана или CSS-размера элемента. Значение сериализованной картинки нельзя превращать в наблюдение плотности экрана. Разделение размеров растра, CSS-разметки и закодированных метаданных позволяет сравнивать именно изменившийся вход.

toDataURL() создаёт в памяти строку для всего изображения. MDN предупреждает о возможных затратах для больших изображений и ограничениях длины URL при присваивании строки свойству src изображения. Предупреждение не устанавливает, что экспорт или последующее присваивание действительно завершились сбоем. В отчёте об отсутствующем изображении после присваивания большого URL нужно отделять экспорт от последующей потребляющей операции: невозможность показать URL не доказывает, что сериализация вернула data:,.

toBlob() избегает строкового интерфейса URL данных, но не гарантирует успех при любых условиях или нулевое потребление памяти. Стандарт по-прежнему описывает копирование растра и сериализацию. Немедленный возврат равен undefined; результат изображения поступает в обратный вызов. Запись немедленного значения как «изображения нет» неверно понимает контракт, даже если позже обратный вызов получает корректный Blob. Значение null в нём означает отсутствие такого результата, а синхронный SecurityError возникает раньше и относится к другому пути.

Сценарии сравнения отчётов об отпечатке

Две записи содержат data:,, но размеры растра различаются. В одной может быть нулевой размер, а другая запрашивает неподдерживаемый размер или достигает сбоя сериализации. Равенство строк устанавливает равенство пустого результата, а не отрисованного отпечатка. До решения об общей причине нужно сохранить width и height. Без этих входов корректная классификация означает пустой экспорт с неустановленной причиной, а не совпавшую сигнатуру устройства.

После запроса JPEG экспорт успешно создаёт PNG. Успешный файл доказывает, что запасной путь произвёл PNG. Он не доказывает обработку запроса кодировщиком JPEG. Перед объединением записи с результатами JPEG нужно сравнить запрошенный и фактический типы. Сравнение хешей таких представлений отвечает на вопрос о равенстве файлов и само по себе не выявляет различие первоначального рисунка Canvas.

Проверка меняет хеш на общую ложную метку. Видимое изменение может следовать за сбоем экспорта, но общая метка не называет ветвь. Код проверки или запись собственного приложения должны установить, было ли перехвачено исключение, отклонён пустой результат или нарушен последующий этап изображения. Опубликованный разбор BrowserLeaks отделяет видимый вывод от полного диагноза; та же граница не позволяет без доказательств связывать неизвестную ветвь с настройками приватности.

Журнал toBlob() фиксирует undefined, а более поздний обратный вызов фиксирует файл. Эти наблюдения совместимы. Немедленное значение не является асинхронным результатом изображения. Нужно сравнивать итоги обратных вызовов друг с другом, а не немедленный возврат одного API с окончательной картинкой другого. В обращении о совместимости этап операции должен сопровождать имя метода, особенно при объединении журналов разных реализаций экспорта.

Изменение размера CSS исправляет вид страницы, но размеры экспорта остаются прежними. Показ и растр отвечают на разные вопросы. Изменение разметки может улучшить отображение, не изменив растр, переданный сериализатору. Если вопрос относится к видимому элементу, нужно сохранить обе группы размеров; если к сериализации, только размеры растра. Тогда визуальная правка не будет названа изменением входа отпечатка, который фактически не менялся.

Экспорт не origin-clean выбрасывает исключение до возврата пустого результата. Порядок исключения является частью доказательств. Обёртка, преобразующая исключение в ложное значение, должна фиксировать преобразование: по одному ложному значению нельзя восстановить синхронное исключение. Для этого различия не нужны сырые пиксели; метода, этапа и имени исключения достаточно, чтобы отделить его от предусмотренного стандартом пустого результата.

Минимальная диагностическая запись

Полезная запись называет method, растровые width и height, requestedType, actualType, outcome и phase. При синхронном сбое можно сохранить exceptionName вместо изображения. Для toBlob() нужно отделять немедленный вызов от завершения обратного вызова. Эти поля описывают операцию и результат без полного URL данных, закодированной картинки или хеша. Схема определяет доступные поля хранения; только реальная запись приложения устанавливает выполненную ветвь.

ПолеСохранитьНе выводить из него
width, heightРазмеры растра, переданного на экспортРазмеры физического экрана
requestedType, actualTypeЗапрошенное и полученное представлениеПоддержку всех запрошенных кодировщиков
phaseВызов, синхронное исключение или завершение обратного вызоваЧто немедленный undefined означает сбой изображения
outcomeИзображение, пустой результат, null обратного вызова или исключениеИдентичность устройства или вердикт о манипуляции
exceptionNameНаблюдавшийся класс исключения, если он доступенОтветственный ресурс другого происхождения

Если отчёт содержит только перехваченное ложное значение, нужно сохранить это ограничение, а не заполнять exceptionName по ожиданию. Недоступная деталь отличается от наблюдавшегося исключения. То же верно для размеров: нельзя заменять отсутствующие размеры растра CSS-прямоугольником, измеренным позже. Производные поля могут помогать, но требуют собственных меток, чтобы запись не стала незаметно точнее своих доказательств.

Документация Canvas BotBrowser описывает --bot-noise-canvas и --bot-noise-seed. Эти настройки относятся к согласованности пиксельного вывода. Они не устанавливают представление конкретного экспорта или выполнение условия безопасности его растром. Конфигурацию запуска следует хранить отдельно от состояния экспорта; неизменные настройки не доказывают неизменность всех входов последующей проверки отпечатка.

Минимальная запись может также исключать полные URL ресурсов, идентификаторы аккаунтов и содержимое изображений. Ревизии исходников или метки сборки часто достаточно, чтобы назвать предусмотренный путь экспорта. Если конкретный ресурс необходим для собственного расследования, следует применять правила хранения приложения, а не публиковать URL или пиксели. Диагностическая ценность состоит в сохранении ветви, а не в накоплении повторно используемой сигнатуры изображения.

Частые вопросы о состояниях экспорта Canvas

Является ли data:, корректным PNG без видимого рисунка?

Нет. Стандарт описывает пустой текстовый ресурс. Ненулевой растр с прозрачными пикселями является другим состоянием и может сериализоваться в изображение. Пустой результат не содержит закодированного PNG для сравнения.

Доказывает ли data:, блокировку Canvas-отпечатка?

Нет. Его могут давать нулевое значение хотя бы одного измерения и сбой сериализации; MDN также описывает ограничение размера реализации. Одна строка не устанавливает настройку приватности или интерпретацию сбоя детектором.

Может ли неподдерживаемый формат вернуть корректное изображение?

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

Называет ли SecurityError изображение, вызвавшее проблему?

Нет. Он устанавливает состояние не origin-clean при экспорте. Исключение не содержит всей истории рисования и не определяет ответственный ресурс или конфигурацию его ответа.

Является ли немедленный undefined от toBlob() ошибкой?

Нет. Это документированный возврат метода. Обратный вызов получает изображение Blob или null; синхронное исключение безопасности отличается и от немедленного возврата, и от последующего обратного вызова.

Есть ли максимальный размер Canvas, общий для всех браузеров?

Цитируемые источники не дают переносимого числового предела. Нужно записать запрошенные размеры и наблюдавшееся состояние. Максимум одного браузера в одной среде нельзя считать пределом всех реализаций.

Устанавливает ли одинаковый URL данных одинаковую идентичность браузера?

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

Объясняет ли фиксированная затравка шума ошибку экспорта?

Сама по себе нет. Настройки затравки касаются согласованности пикселей, а документированные состояния зависят от размеров, origin-clean, представления и сериализации. Одна затравка не устанавливает выполненные условия или факт экспорта изображения.

Источники

Практический вывод

До сравнения Canvas-отпечатка нужно классифицировать экспорт. data:,, синхронный SecurityError, null обратного вызова, запасной PNG и фактически закодированное изображение являются разными результатами. Следует сохранять размеры растра и запрошенное в сравнении с полученным представление, исключая сырые изображения, когда вопрос не требует их. Общая обработка Canvas-отпечатка и разбор BrowserLeaks описывают разные последующие этапы после успешного экспорта.

#Canvas#fingerprinting#приватность

Эта статья входит в руководство: Что такое отпечаток браузера?

Переведите BotBrowser из исследований в продакшн

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