Глубина стека JavaScript: сигнал конфиденциальности браузера
Узнайте, почему предел рекурсии JavaScript меняется в разных контекстах, как ответственно проверять этот сигнал и чем управляет BotBrowser.
BotBrowser Team
Нужна поддерживаемая продуктовая документация?
У этой статьи есть соответствующая страница в центре документации. Используйте docs для каноничного сценария настройки, актуальных флагов и долгосрочной справки.
Статья о глубине рекурсии JavaScript как о входе в отпечаток браузера. BotBrowser выбирает наблюдаемый предел через --bot-stack-seed, но не меняет нативное распределение стека операционной системой и не снимает ограничения памяти браузера.
Краткое резюме
Значение profile использует глубину из профиля, real отражает хост, а целое зерно даёт повторяемую вариацию. Сравнивайте основной поток и Worker одной тестовой страницей с ограниченной рекурсией и сохраняйте профиль, режим, зерно и версию.
Содержание руководства
- Что показывает измерение
- Почему важны контекст и версия
- Граница поддержки BotBrowser
- Выбор режима для проверки
- Повторяемая проверка приложения
- Как читать изменившийся счётчик
- Ограничения и решения о конфиденциальности
У рекурсии JavaScript есть практический предел. Когда функция продолжает вызывать себя, браузер останавливает вызовы и сообщает о переполнении стека, обычно через RangeError. Число успешных вызовов до ошибки является наблюдаемым поведением приложения. Веб-платформа не задает одно значение, поэтому результат различается между реализациями, версиями, операционными системами и контекстами. BotBrowser может выполнять проверку глубины стека в изолированном контролируемом контексте с одним профилем, но не делает глубину одинаковой для других сборок, платформ и движков JavaScript.
Эта разница важна для конфиденциальности: страница может выполнить небольшой рекурсивный тест и сохранить счетчик как один вход браузерного отпечатка. Число не является именем, учетными данными или доказательством местоположения. Это небольшой технический сигнал, который вместе с другими наблюдениями может дать умеренное различие. Рассматривайте его как один сигнал, а не как вывод об идентичности.
Полезный вопрос для команды продукта заключается не в сборе более подробного профиля, а в предсказуемом поведении приложения при изменении значения и в выборе конфигурации, соответствующей проверяемому профилю. Приложение с резервным путем должно работать, когда тест недоступен, неопределенен или отличается от предыдущего сеанса. Ни одна задача пользователя не должна зависеть от конкретного числа.
Что показывает измерение
Каждый вызов JavaScript добавляет кадр в стек вызовов. Кадр хранит сведения о возврате и состоянии выполнения, а браузер управляет памятью и проверками безопасности вокруг стека. Важна форма кадра: небольшая рекурсивная функция может получить другое число, чем функция с большим числом параметров или локальных значений. Поэтому измерение описывает и тест, и контекст. Сравнение имеет смысл, когда форма теста и состояние страницы стабильны.
Конечная ошибка защищает страницу от бесконечной рекурсии. Перехват ошибки позволяет завершить проверку, но не меняет предел. JavaScript не может запросить больший нативный стек для уже созданного потока и не может переписать учет стека. Скрипт может не запускать проверку, но это не меняет того, что другая страница увидит в своем контексте.
Распределение стека операционной системой является одним из факторов, но не единственным. Реализации используют разные кадры, запасы безопасности, пути оптимизации и настройку контекста. Обновление браузера может изменить любую деталь. Даже при свободной памяти хоста счетчик может отличаться, потому что предел является политикой выполнения, а не текущим измерением свободной памяти.
Основное окно и worker не обязательно запускаются с одинаковыми условиями стека. У выделенных и общих workers своя настройка, а WebAssembly следует собственным правилам выполнения. При сравнении нужно записывать название контекста и форму теста. Результат основного потока не является обещанием для worker и не должен классифицировать устройство.
Почему важны контекст и версия
Страница может видеть стабильное значение в одном сеансе, но стабильность не означает постоянство. Версия браузера, обновление системы, усиление защиты и изменение кода могут повлиять на счетчик. Небольшая правка рекурсивной функции также его изменит. Поэтому историческое значение само по себе является слабым доказательством, а поддержке следует записывать версию браузера и ревизию теста.
Лучше всего сигнал работает как проверка согласованности в собственном тесте. Команда может сравнить результат основного потока с результатом worker, который действительно использует приложение. Тогда тест отвечает, соответствует ли выбранный профиль этому приложению. Он не должен идентифицировать неизвестного посетителя, выводить характеристики оборудования или принимать решение о доступе по числу.
Руководство по отпечаткам MIME и кодеков полезно как дополнение, если проверка также охватывает медиавозможности; это наблюдение следует хранить отдельно от счетчика рекурсии.
Сервис, уважающий конфиденциальность, держит результат рядом с решением, которому он нужен. Если требуется лишь понять, безопасна ли необязательная глубокая рекурсия, достаточно локальной политики, после чего исходный счетчик можно удалить. Для поддержки записывайте ревизию теста, версию браузера и выбранную политику, а не добавляйте число к идентификатору аккаунта. Так его легче удалить и сложнее использовать между сеансами.
Для конкретного сравнения запишите browserVersion, profileId, fixtureRevision, context и пойманный RangeError; эти поля объясняют изменение без идентификатора посетителя.
То же ограничение относится к аналитике. Панель может показать, что функция выбрала базовый или облегченный путь, но не должна сортировать людей по глубине стека. Агрегированные результаты завершения, отмены и восстановления лучше описывают опыт. При отсутствии или ошибке измерения обязательные данные и элементы управления должны оставаться доступными.
Граница поддержки BotBrowser
BotBrowser предоставляет --bot-stack-seed, чтобы выбрать источник наблюдаемого предела рекурсии JavaScript для профиля. Значение profile использует глубину, связанную с выбранным профилем. Значение real сохраняет нативный результат хоста. Целочисленное зерно задает детерминированное изменение сеанса, поэтому один профиль и одно зерно дают повторяемый вход для проверки. Это поддерживаемые варианты конфигурации, а не обещание одного числа для любого приложения.
Настройка предназначена для согласования наблюдаемого браузером сигнала с проверяемым профилем. Она может применяться к основному потоку, Web Workers и поддерживаемым продуктом контекстам WebAssembly. Команда все равно должна измерять контексты своего приложения, поскольку условия worker и окна различаются. Профиль не заменяет проверку совместимости, а результат не доказывает личность.
BotBrowser не меняет нативное распределение стека операционной системой и не устраняет общие ограничения памяти браузера. Настройка касается предела рекурсии, видимого странице, а не обычного использования стека кодом приложения. Обычный код находится далеко от предела, но приложению с намеренно глубокой рекурсией нужны собственные тесты производительности, ошибок и ресурсов.
BotBrowser также не знает, запускает ли сторонняя страница рекурсивную проверку. Он предоставляет настроенное поведение профиля, но не может заставить страницу забыть значение, решить, как она его хранит, или заменить ее политику конфиденциальности. Правильная реакция продукта заключается в минимизации сбора, объяснении необязательной диагностики и сохранении базового пути.
Выбор режима для проверки
Используйте profile, когда приложение проверяется по поведению стека, записанному для конкретного профиля. Это удобно для проверки согласованности связанных браузерных поверхностей при регрессионном просмотре. Записывайте рядом версию, профиль и ревизию теста, чтобы увидеть, связана ли разница с настройкой или страницей.
Используйте real, когда тест должен описывать хост, на котором запущен браузер. Режим подходит для отладки, оценки ресурсов или отчета, представляющего эту машину. Он не делает результат переносимым и не означает, что хост представляет все поддерживаемые среды.
Используйте целочисленное зерно, когда нужна повторяемая вариация без ручного задания глубины. Зерно является входом конфигурации, а не идентификатором, который следует показывать странице. Храните его с профилем и версией в контролируемой записи, не помещайте в аккаунты, URL или аналитические поля. Разные зерна могут дать разные результаты, поэтому сравнивайте только запуски с одинаковыми заявленными входами.
Не выбирайте режим, чтобы принудительно получить произвольное число. Крайнее или недокументированное значение может расходиться с другими поверхностями профиля и скрыть дефект приложения. Безопаснее спросить, дает ли выбранный профиль и версия правдоподобный повторяемый результат в принадлежащих приложению контекстах. Если рабочей нагрузке нужна большая глубина, проверяйте ее отдельно в нативном режиме и с обычным наблюдением ресурсов.
Повторяемая проверка приложения
Начните с небольшой тестовой страницы, которая вызывает ограниченную рекурсивную функцию и перехватывает ожидаемое переполнение. Записывайте только нужный счетчик, контекст и версию браузера. Сначала запустите тест в главном окне, затем в каждом worker, который реально использует приложение. Тест не должен перечислять посторонние свойства браузера или отправлять технический список на сервер.
Повторите тест с тем же профилем и зерном после чистого запуска браузера. Повторяемый результат показывает, что конфигурация загружена согласованно, но не является гарантией производства. При изменении проверьте путь профиля, версию, запуск worker и ревизию теста. Новый пакет страницы может изменить форму кадров даже при неизменной конфигурации браузера.
Проверяйте путь ошибки так же внимательно, как успешный путь. Если рекурсия недоступна, возникает неожиданная ошибка или worker не запускается, приложение должно сохранить обязательное содержимое и показать понятный резервный вариант. Необязательное улучшение можно отложить, а навигация, элементы аккаунта и доступное состояние должны остаться рабочими. Для человека это важнее счетчика глубины.
При сравнении разных хостов сначала сравните заявленные входы. Одного имени профиля недостаточно, если различаются версия, параметры, код теста или контекст. Запись должна быть короткой: идентификатор профиля, режим, тип зерна, версия, контекст, политика и результат. Не сохраняйте подробное описание оборудования только потому, что тест показал один технический сигнал.
Обзор отпечатков браузера объясняет сочетание небольших сигналов. Руководство по свойствам Navigator отделяет сообщаемое свойство браузера от идентичности. Сопоставьте руководство по целостности API браузера, если тест выполняется в нескольких контекстах. Эти ссылки дают контекст, но не превращают глубину в самостоятельный идентификатор.
В строке проверки укажите profile, real или целочисленный seed, а также пометьте измеренные контексты page, Worker и WebAssembly.
Как читать изменившийся счётчик
| Что изменилось между двумя запусками | Что это обычно значит | Следующая проверка |
|---|---|---|
| Только версия браузера | Сместилась раскладка кадров или запас | Повторить один раз на прежней версии |
| Только функция теста | Изменилась форма кадров, а не браузер | Зафиксировать ревизию теста и сравнить снова |
| Только контекст | Основной поток и worker никогда не делили лимит | Сравнивать каждый контекст с его историей |
| Всё сразу на одной машине | Параметр или путь профиля не применились | Напечатать действующую командную строку |
У изменившегося счётчика есть четыре обычных объяснения, и сам счётчик их не различает. Два запуска, различающиеся ровно одной из этих переменных, отвечают на вопрос; различающиеся несколькими не отвечают ни на что. Запишите все четыре входа и меняйте только один.
Сначала зафиксируйте тест. Сохраните рекурсивную функцию версионированным файлом и печатайте её ревизию рядом с результатом: другое число параметров, другое замыкание или добавленный блок try меняют форму кадров, а значит и глубину. Тест, который «уплыл», является самой частой причиной «регрессии», которая на деле является правкой страницы.
Затем зафиксируйте версию. Сравнивайте полную строку сборки, а не только мажорную версию, потому что лимит является политикой исполнения и смещается вместе с усилением безопасности и генерацией кода. Если сместилась только версия, один повторный запуск на прежней сборке отделяет реальное изменение от шума между запусками, чего повторение новой сборки не даёт.
Третье: сравнивайте каждый контекст с ним самим. Число основного потока и число worker никогда не должны были совпадать, и пара округлённых значений ничего не говорит о стабильности ни одного из них. Записывайте каждый контекст отдельно по двум запускам одной сборки.
Если все три входа совпадали, а число всё равно сместилось, напечатайте действующую командную строку прежде чем винить браузер. Параметр, который есть в скрипте запуска, но отсутствует в аргументах процесса, или путь профиля, разрешившийся в другой файл во второй оболочке, дают изменение, похожее на различие браузеров, которым оно не является.
Короткая запись делает это проверяемым позже:
release=142.0.7444.60
fixtureRevision=3
mode=profile
context=main depth=10789 RangeError
context=worker depth=10761 RangeError
Двух файлов такой формы, снятых с разницей в одну версию, достаточно, чтобы сказать, какое из четырёх объяснений подходит. Одно число, скопированное из консоли, этого не даёт.
Ограничения и решения о конфиденциальности
Глубина имеет ограниченную энтропию и является вспомогательным доказательством. Она меняется с формой кода и условиями выполнения и сама по себе надежно не идентифицирует браузер, устройство или человека. Бесконечное хранение может принести больше риска, чем пользы. Предпочитайте краткосрочное решение, понятный срок хранения и удаление после завершения проверки.
Не используйте счетчик для авторизации, доказательства мошенничества, географического вывода или замены безопасности аккаунта. Он не показывает надежность посетителя и не доказывает принадлежность двух сеансов одному человеку. Аутентификация, ограничения частоты и работа с нарушениями требуют собственных серверных данных.
Не обещайте одинаковое поведение всех семейств браузеров, операционных систем, реализаций workers или сред WebAssembly. Публичная документация объясняет область, а тесты совместимости устанавливают поддержку конкретного продукта. При изменении результата после выпуска обновите запись теста и изучите видимый эффект, прежде чем менять политику профиля.
Понятная заметка поддержки должна описать обе стороны: BotBrowser может выбрать профильное, нативное или основанное на зерне поведение стека для поддерживаемых контекстов, но не меняет распределение хоста, не гарантирует результат приложения и не контролирует записи сторонней страницы. Практический шаг прост: проверьте собственный процесс, сохраните резервный путь и оставьте только нужное доказательство.
Описывайте изменение результата как наблюдение совместимости, а не как новую категорию личности. Укажите сравниваемые версию, режим, контекст и ревизию. Если страница завершает задачу, изменение для пользователя может не понадобиться. Если необязательная функция нестабильна, измените ее политику и восстановление, а не сбор данных и не ярлык посетителя. Добавьте видимый резервный вариант, доступное действие и срок хранения, чтобы поддержка понимала случай и могла проверить выполнение задачи.
Команда поддержки может разделить сведения о конфигурации и приложении. Первые содержат профиль, режим, зерно и версию. Вторые показывают загрузку, завершение работы и доступность резерва. Разделение не дает техническому числу стать скрытым атрибутом аккаунта и позволяет повторить проверку без данных клиента.
Тест должен также проверять отмену и навигацию. Ненужная рекурсивная операция должна прекращаться при уходе со страницы, а закрытый worker не должен планировать новую работу. Это обычные проверки жизненного цикла, которые ограничивают расход ресурсов и позволяют отказаться от необязательной работы без блокировки важных элементов.
Доступность входит в ту же проверку. Сообщение о недоступном worker должно быть передано вспомогательным технологиям, а резервный путь должен сохранять клавиатуру, читаемый текст и основное действие. Техническое измерение не заменяет доступный опыт. Записывая политику и видимый результат, команда улучшает состояние без хранения исходного счетчика.
Перед изменением политики сравните обычные причины: версию, запуск worker, измененную функцию, безопасность или хост. Само число их не различает. Короткий список с названным тестом и ограниченным резервом надежнее бесконечного отбора. После исправления собственного процесса прекратите сбор значения и оставьте только решение поддержки.
Эти правила оставляют глубине узкую и проверяемую роль. Она помогает проверить согласованность профиля в принадлежащих команде контекстах, а дизайн приложения отвечает за устойчивость, конфиденциальность и доступность. Граница понятна: осознанно настройте браузер, измеряйте только нужное и сохраняйте полноценный опыт при изменении сигнала.
Для записи проверки нужен ясный срок хранения. Оставляйте профиль, версию, ревизию теста, контекст и видимый результат, пока вопрос совместимости открыт. Удаляйте исходный счетчик, когда он больше не помогает принять решение, и включайте резервное поведение в критерий приемки. Тогда техническое наблюдение остается частью временной инженерной задачи, а не атрибутом аккаунта.
Пока дело открыто, запись может содержать retentionDays, fallback, outcome, release и fixtureRevision, после чего исходное число удаляется.
Публичные источники
- Документация BotBrowser о глубине стека
- Обзор отпечатков браузера BotBrowser
- Справочник флагов CLI BotBrowser
- MDN: ошибка слишком глубокой рекурсии
Практический итог
Выбирайте режим по вопросу проверки и не используйте счётчик как разрешение, доказательство мошенничества или признак местоположения. Если результат изменился, сравните версию браузера, способ запуска Worker, ревизию фикстуры и хост, прежде чем менять политику профиля, и сохраняйте рабочий запасной путь. Сырой счётчик храните только пока вопрос совместимости открыт.
Эта статья входит в руководство: Что такое отпечаток браузера?
Похожие статьи
Как hardwareConcurrency раскрывает реальные ядра вашего CPU
ОтпечаткиВоспроизводимость шумового зерна для повторяемых запусков
ОтпечаткиСигналы памяти и хранилища в профилях
ОтпечаткиДетерминированный режим: воспроизводимые отпечатки
ОтпечаткиИнформация об адаптере WebGPU и конфиденциальность пользователя
ОтпечаткиАудио-отпечатки: как AudioContext отслеживает вас
Переведите BotBrowser из исследований в продакшн
Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.