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

FingerprintJS OSS: сбор данных и происхождение хеша

Проследите load(), порядок источников, ошибки компонентов и отложенное хеширование visitorId в FingerprintJS OSS, не утверждая, что запускался детектор.

BotBrowser Team

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

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

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

BotBrowser может повторить разрешенный fixture на том же origin и сохранить ограниченные наблюдения о возможностях, статусах компонентов и пути хеширования, но не может запускать сторонний детектор, устанавливать личность или доказывать, что поставщик использует те же сигналы. В этом разборе исходников прослеживается FingerprintJS OSS commit 7a738d0e9920c7431b34aff24b345a21f9054855 в src/agent.ts, src/sources/index.ts и src/index.ts.

TL;DR

  • По умолчанию load() устанавливает monitoring = true; monitoring: false отключает неперсонализированный запрос статистики установки.
  • get() собирает компоненты, возвращает для каждого value или error и предоставляет отложенный visitorId.
  • hashComponents() сортирует ключи компонентов и хеширует канонические значения; это объясняет происхождение результата библиотеки, а не устанавливает личность.
  • Порядок важен: асинхронные источники запускаются первыми, а источники WebGL идут после источников, способных повлиять на рендеринг.

Contents

SOURCE_ORDER ведет к COMPONENT_STATUS, CANONICAL_HASH, LAZY_VISITOR_ID и ограниченной записи для приватности

Проследите публичные точки входа

Закрепленный src/index.ts экспортирует load, hashComponents, типы компонентов и реестр источников. Публичный API не возвращает promise с данными о человеке: он создает агент, чей get() разрешается структурированным результатом. Сохраняйте ссылку на commit рядом с разбором: изменяемая ветка может переставить источники или изменить поля.

load() выполняется асинхронно. Она может отправить статистику установки, ожидает prepareForSources(), создает загрузчик встроенных источников и возвращает агент. Значение по умолчанию monitoring = true подтверждается исходным кодом. Fixture должен указывать, задавалась ли опция явно, а не описывать значение по умолчанию как измеренное сетевое событие.

Разберите сбор данных и monitoring

В src/agent.ts определен LoadOptions.monitoring; документация к опции говорит, что false отключает неперсонализированный AJAX-запрос. Реализация с вероятностной выборкой проходит путь мониторинга и открывает m1.openfpcdn.io/fingerprintjs/v${version}/npm-monitoring; этот разбор не утверждает, что запрос отправлялся. Безопасное наблюдение за исходниками фиксирует опцию, строку кода и документированное назначение. Оно не сохраняет заголовки запросов, cookies, идентификаторы аккаунта или ответ третьей стороны.

monitoring: false означает наблюдение о конфигурации, а не гарантию анонимности. Страница все еще может собирать компоненты, а приложение может отправлять собственную телеметрию. Отделяйте опцию библиотеки от политики приложения и серверных журналов. В документации BotBrowser о согласованности автоматизации описаны контролируемые проверки страниц; она не устанавливает, что сервис делает с идентификатором посетителя.

Сохраняйте состояния value и error

get() ожидает загрузчик компонентов и возвращает components. Тип компонента допускает value либо error, поэтому отсутствие возможности не равнозначно значению null. Ограниченный fixture может записать имена компонентов, статус (value или error) и общую форму значения. Не публикуйте пиксели Canvas, аудиосэмплы, данные аккаунта или все значения компонентов.

Например, закрытая запись может выглядеть так:

{
  "fixtureId": "fpjs-source-01",
  "commit": "7a738d0e9920c7431b34aff24b345a21f9054855",
  "monitoringOption": "false",
  "componentStatus": { "canvas": "value", "fonts": "value", "webGlBasics": "error" },
  "hashAccess": "not-measured",
  "testedOn": "2026-10-29"
}

Запись отличает ошибку компонента от успешного компонента, значение которого было скрыто. Так передача по совместимости остается полезной, не превращая запись в повторно используемый профиль. Для связанного сравнения браузерной стороны см. проверку браузерного отпечатка и целостность API браузера между realms.

В отчете стоит различать три случая. Компонент может дать пригодное значение, вернуть пустое или близкое к null значение либо завершиться ошибкой. Скрытие данных добавляет четвертый случай: у теста было значение, но он решил его не сохранять. Если запись сводит эти случаи к “отсутствует”, нельзя понять, нет ли у браузера нужного API, вернул ли источник допустимое пустое значение, упал ли источник или политика приватности удалила подробность.

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

Проследите порядок источников и асинхронную работу

В src/sources/index.ts указано, что асинхронные источники стоят первыми, чтобы выполняться параллельно с остальными. Реестр начинается с userAgentData, fonts, domBlockers, fontPreferences, audio и screenFrame, а затем включает canvas, экран, хранилища, язык, оборудование и источники, связанные с политиками. Этот точный список является деталью реализации данного commit, а не универсальным стандартом браузерного отпечатка.

В файле webGlBasics и webGlExtensions стоят в конце, поскольку некоторые источники могут влиять на другие, включая WebGL и canvas. Поэтому порядок является частью происхождения результата. Если следующий commit переместит источник, сравните commit и первый изменившийся компонент, прежде чем связывать новый хеш с изменением браузера.

Та же дисциплина относится к отказам компонентов. Если webGlBasics сообщает об ошибке, не делайте вывод, что WebGL недоступен глобально или что весь последующий результат обязан отличаться. Запишите результат компонента, условия теста и любую прямую ошибку браузера, которую показывает разрешенный fixture. Без трассы выполнения называйте объяснение возможностью на основе исходника, а не диагнозом.

Поймите происхождение хеша и отложенный visitorId

hashComponents() сортирует ключи компонентов, сериализует значения или литерал error, экранирует разделители в именах компонентов и передает каноническую строку в x64hash128. Функция объясняет, как эта версия библиотеки получает хеш объекта компонентов. Она не доказывает уникальность или стабильность входных данных, не устанавливает, что они относятся к человеку, и не предсказывает принятие третьей стороной.

Геттер visitorId работает отложенно. makeLazyGetResult() сразу вычисляет confidence, но вызывает hashComponents(this.components) только при первом чтении, после чего кэширует результат. Тест, который не читает visitorId, не задействовал путь хеширования. Два чтения проверяют повторное использование кэша, а не два независимых сбора данных. Записывайте hashAccess как not-measured, first-read или reused, а не выдумывайте вывод о выполнении.

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

Создайте ограниченное наблюдение исходников

Следующая команда получает закрепленный исходник и печатает только структурные строки. Это наблюдение публичного исходника, а не запуск BotBrowser и не запрос к защищенному сайту:

curl -fsSL https://raw.githubusercontent.com/fingerprintjs/fingerprintjs/7a738d0e9920c7431b34aff24b345a21f9054855/src/agent.ts | rg -n 'monitoring = true|hashComponents\(this.components\)|const components = await getComponents|request.open'

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

Установите границу приватности

Рекомендации W3C по fingerprinting рассматривают отпечаток как вопрос приватности; глоссарий MDN объясняет общий термин. Эта статья добавляет происхождение исходников и правила сокрытия данных. Она не утверждает, что FingerprintJS OSS является полным детектором или что visitorId устанавливает личность.

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

Практический обзор минимизации задает четыре вопроса до запуска теста. Какое утверждение требует каждое поле? Можно ли ответить статусом или формой вместо значения? Кто может видеть артефакт? Когда артефакт будет удален? Если поле не отвечает на первый вопрос, опустите его. Если достаточно статуса, не собирайте подробное значение “на всякий случай”. Включите дату хранения в задачу теста, а не оставляйте ее напоминанием на потом.

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

Practical conclusion

Закрепите commit, отличайте конфигурацию monitoring от сетевого свидетельства выполнения, раздельно сохраняйте value и error и отмечайте, читался ли отложенный хеш. Порядок источников и каноническое хеширование объясняют происхождение результата, но не устанавливают личность, энтропию, анонимность или решение третьей стороны.

Sources

Next reading

Используйте проверку браузерного отпечатка для собственных страниц и целостность API браузера между realms, когда одно свойство читается из нескольких контекстов.

#FingerprintJS#Browser Fingerprinting#visitorId#приватность#Source Provenance

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

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

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