Перечень MediaDevices и приватность виртуальных камер
Отделяйте список устройств от разрешения и активного потока; учитывайте ограничения и требования виртуальных источников.
BotBrowser Team
Нужна структурированная документация по теме Отпечатки?
Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.
Перечень медиаустройств помогает выбрать камеру или микрофон, но не доказывает, что страница может получать с него данные. enumerateDevices() сообщает о входах и выходах с учётом разрешений и политик; getUserMedia() отдельно запрашивает доступ и пытается открыть реальный источник. Виртуальная камера должна предоставляться внешним программным обеспечением. Список одновременно является чувствительной с точки зрения приватности поверхностью браузера и лишь ограниченной подсказкой для выбора: объясните цель, запрашивайте только нужный поток и показывайте активный источник. BotBrowser контролирует способ сообщения об этом перечне, но не создаёт источник, не выдаёт разрешения и не гарантирует рабочий поток.
Это различие важно при оценке идентичности браузера. Страница может узнать о наличии категории камеры или микрофона ещё до появления понятной подписи, но это само по себе не доказывает согласие, исправность оборудования или доступность потока. См. также отпечаток по разрешениям браузера и сетевую приватность WebRTC.
Смотреть видео
В этом видео на английском прослежен один вызов enumerateDevices() в контролируемой лабораторной странице: kind, label и deviceId, которые получает страница, почему подписи остаются за разрешением, и чем режим профиля отличается от реального режима как источник устройств. Показано одно наблюдение на Ubuntu runner; видео не сравнивает хосты, не даёт разрешение на захват и не устанавливает идентичность, анонимность, доступ или решение удалённого сайта.
Кратко
Перечень устройств - это отфильтрованное разрешениями представление, а не доказательство захвата. BotBrowser может управлять списком устройств профиля, сообщаемым странице, но разрешение, доступность источника и поток остаются отдельными условиями браузера и операционной системы.
Содержание
- Смотреть видео
- Что сообщает перечисление устройств
- Почему список ограничен и затрагивает приватность
- Перечень устройств не означает работающий поток
- Что добавляет виртуальная камера
- Порядок действий при настройке и сбое
- Управление перечислением и ограничения BotBrowser
- Итоги
Что сообщает перечисление устройств
Уведомление об изменении доступно только в поддерживающих его браузерах, а время события может различаться. Интерфейс должен уметь обновлять список и обрабатывать исчезновение источника до его открытия.
navigator.mediaDevices.enumerateDevices() возвращает записи MediaDeviceInfo для входов и выходов, которые браузер показывает в текущем контексте. kind различает аудиовход, видеовход и аудиовыход, а label содержит понятное пользователю имя, если его раскрытие разрешено. Браузер может поставить устройства захвата по умолчанию первыми. Поэтому результат - упорядоченный, зависящий от контекста список, а не полная опись подключённого оборудования. Первая запись не обязательно означает «камера»: в списке бывают разные типы устройств, а порядок по умолчанию не выражает предпочтение пользователя.
Контекст ограничивает список. Для соответствующих интерфейсов нужна защищённая среда; политика разрешений может исключить тип устройства, а состояние разрешений влияет на видимые устройства и подписи. До предоставления доступа часть записей может отсутствовать или иметь пустые подписи. После разрешения список может стать информативнее, но не становится постоянным. Подключённая гарнитура, другая камера, изменение разрешения браузера или настройка ОС могут изменить результат.
Даже без подписей наличие и тип записей могут показать, есть ли в контексте выбор камеры или микрофона. Количество, порядок и изменение имён добавляют сведения о конфигурации. Повторный сбор списка поэтому является решением о приватности, а не безобидной диагностикой. Если пользователю нужно выбрать источник для звонка, оставьте список в интерфейсе и не отправляйте его целиком в аналитику. Для поддержки сохраняйте только сведения, нужные для решения конкретной проблемы, а не инвентаризацию устройств.
Считайте результат снимком состояния. Подключение гарнитуры, запуск виртуальной камеры, смена разрешения или переход на другой компьютер может изменить то, что сообщает браузер. Спецификация Media Capture определяет уведомление об изменениях устройств, видимых документу, но приложение всё равно должно обновлять список в подходящий момент и обрабатывать исчезновение выбранного источника между выбором и захватом. Уведомление не гарантирует, что любой аппаратный или системный переход немедленно отразится во всех браузерах.
Чтобы решение читалось на узком экране, представляйте каждый результат короткой карточкой:
- Появился видеовход. Следует: браузер сообщает о выборе видеоустройства в этом контексте. Не доказывает: что камера включена, разрешена или передаёт кадры. Дальше: запросить нужный поток и обработать результат.
- Подпись пустая или общая. Следует: контекст не получает полезное имя. Не доказывает: что устройства нет или оно неисправно. Дальше: проверить защищённый контекст, политику, разрешение и ожидаемое поведение подписей.
- Появились несколько записей или изменился порядок. Следует: сообщается несколько вариантов или представление изменилось. Не доказывает: что первый вариант предпочтителен или список постоянен. Дальше: дать пользователю выбор и обновлять список.
- Подходящей записи нет. Следует: текущий результат не раскрывает подходящий вариант. Не доказывает: что в системе нет физического или виртуального источника. Дальше: проверить ОС, приложение-источник и политику.
Таблица не позволяет превращать наблюдение браузера в чрезмерно сильное утверждение об оборудовании или согласии. MediaDeviceInfo.label - подпись для выбора, а не доказательство владельца устройства или его содержимого. Не путайте её с MediaStreamTrack.label, которая относится к дорожке после начала захвата.
Почему список ограничен и затрагивает приватность
Доступ регулируется несколькими уровнями. Для нужных интерфейсов требуется защищённый контекст. Браузер применяет свою модель разрешений, а страницу во встроенном фрейме может ограничивать политика разрешений. Пользователь может отказать, а операционная система отдельно заблокировать устройство. Разрешение браузера не означает, что ОС способна предоставить кадры; системная настройка сама по себе не разрешает доступ веб-источнику. О том, как политики шире ограничивают возможности браузера, см. Политика разрешений, возможности браузера и приватность.
Браузер может показать только устройства по умолчанию или скрыть подписи, пока источник не получит разрешение на захват. Не обещайте, что перечисление всегда возвращает полный список, и не называйте пустую подпись ошибкой. Объясните уместный шаг: открыть защищённую страницу, проверить разрешение для нужного типа во встроенном контексте, при необходимости посмотреть настройку браузера и повторить запрос после действия пользователя. Не открывайте поток только ради получения имён, если продукту не нужно захватывать медиа.
Набор видимых вариантов может различаться между средами. Если сайт собирает их, он может дополнить ими общий отпечаток браузера. Правильный ответ - минимизировать данные и объяснять потребность, а не обещать, что перечисление скрыто или одинаково везде. deviceId уникален для вызывающего origin и по модели приватности браузера может сохраняться между сеансами, но очистка хранилища или приватный режим могут его заменить. groupId создаётся для каждого документа и нестабилен между сеансами браузера. Ни один из них не является постоянной идентичностью. Не храните подписи, количество или идентификаторы дольше, чем нужно для выбора или поддержки. Не используйте список как фактор аутентификации или замену личности, выбранной пользователем.
При встраивании с другого источника действуют два ограничения: заголовок ответа верхней страницы задаёт список разрешённых источников, а атрибут allow у iframe делегирует функцию только в его пределах. Например:
Permissions-Policy: camera=(self "https://meet.example"), microphone=(self "https://meet.example")
<iframe src="https://meet.example" allow="camera; microphone"></iframe>
Если заголовок исключает встроенный источник, allow не может добавить доступ. Политика исключает заблокированные типы камеры или микрофона из результата enumerateDevices(); это отфильтрованный вид для источника, а не доказательство отсутствия устройства. getUserMedia() остаётся отдельным шагом, зависящим от разрешения и доступности источника.
Интерфейс должен соответствовать запросу: сообщите, нужен ли звук, видео или оба; кто получит данные и будет ли запись; что останется доступно при отказе. Для звонка поддержки только со звуком не следует требовать камеру. Экран выбора не должен незаметно начинать запись. Оставьте возможность сменить выбор или остановить захват и обеспечьте доступность управления без опоры только на предварительный просмотр. По смежной теме аудио см. Доступ к Web Audio API и практические аудиопроцессы.
Перечень устройств не означает работающий поток
Остановка медиадорожки завершает текущий захват, но сама по себе не отзывает разрешение сайта для будущих запросов. Если доступны оба действия, для них нужны отдельные понятные элементы управления.
enumerateDevices() отвечает, какие записи страница видит сейчас. getUserMedia() решает другую задачу: может ли браузер после проверки разрешений открыть аудио- или видеоисточник и вернуть MediaStream. Успешное перечисление не означает успешный захват. Запрос может завершиться отказом пользователя, блокировкой браузера или ОС, неподходящим контекстом либо отсутствием источника. Пока человек не ответил, он может оставаться в ожидании.
Обрабатывайте это как состояние захвата, а не как сбой перечисления. Оставьте путь без камеры или микрофона, если его поддерживает продукт, и не повторяйте запрос после отказа без нового действия пользователя. Если захват начался, показывайте выбранный источник и активное состояние. При отключении сообщите об этом и спросите, хочет ли пользователь выбрать другой: незаметное переключение может изменить то, что будет захвачено, вопреки ожиданиям.
В журналах разделяйте сообщённые устройства, состояние разрешения, результат запроса, выбранную дорожку и активное/завершённое состояние. Это помогает поддержке отличить пустой список от отказа, системной блокировки или завершения дорожки после отключения. Не храните медиасодержимое или весь список только ради различения таких случаев. О другой поверхности устройств с разрешениями см. Разрешения Web Bluetooth, выбор устройства и конфиденциальность.
Что добавляет виртуальная камера
Демонстрация вкладки или экрана - отдельный путь захвата с выбором пользователя. Это не запись камеры из enumerateDevices() и не виртуальная камера.
Виртуальный источник камеры предоставляется установленным приложением или интеграцией ОС. Он может формировать композицию, презентацию, тестовое изображение или другой утверждённый вход. Браузер не создаёт источник при перечислении устройств, а его имя в списке не доказывает, что приложение запущено и выдаёт кадры.
У источника собственный жизненный цикл. Если сценарий этого требует, сначала запустите утверждённое приложение. Затем пользователь выбирает камеру обычным способом в браузере; разрешения сохраняются, а захват зависит от реальной доступности источника. По завершении остановите дорожку и отключите или закройте источник штатным способом. Это разные действия: остановка потока браузера не всегда закрывает приложение, а его завершение может остановить или нарушить уже выбранную дорожку.
Используйте понятное имя, например «Камера для презентации», и укажите, показывает ли источник живую камеру, собранную сцену или тестовую картинку. Перед показом проверьте фактическое содержимое: подготовленная сцена может раскрыть данные аккаунта или внутренние документы, как физическая камера - обстановку комнаты. Виртуальная камера подходит для производства контента, обучения, доступности и тестирования, но не отменяет согласие и проверку содержимого.
Если источник не виден, проверяйте цепочку по порядку: работает ли приложение и выдаёт ли ожидаемую сцену; показывает ли ОС источник браузеру; что вернуло перечисление; что происходит при инициированном пользователем запросе захвата. Каждый этап отвечает на отдельный вопрос. Отсутствие записи не доказывает, что API можно обойти, а изменение списка не гарантирует работающий поток.
Порядок действий при настройке и сбое
Эта схема помогает выбрать следующую проверку, не смешивая обнаружение, согласие и захват. Она подходит для страницы настроек, инструкции поддержки или проверки версии: для каждого состояния указано ограниченное действие.
На узком экране используйте тот же порядок как короткие карточки:
- Контекст не защищён или интерфейс недоступен. Значение: обычный медиасценарий здесь не выполняется. Действие: перейти на поддерживаемую защищённую страницу или объяснить ограничение.
- Устройство не перечислено. Значение: текущий список с учётом разрешений и политик не показывает вариант. Действие: проверить политику встроенной страницы и доступность в ОС, не делая вывода об отсутствии оборудования.
- Устройство есть, но подпись пустая. Значение: вариант виден без полезного имени. Действие: продолжить только при безопасном выборе и проверить разрешения, если имя обязательно.
- Пользователь отказал. Значение: захват не разрешён. Действие: оставить предусмотренную альтернативу и уважать решение.
- Разрешение есть, захват не работает. Значение: разрешение не сделало источник доступным. Действие: проверить системную приватность, приложение, подключение и точную ошибку.
- Захват начался и прекратился. Значение: активная дорожка завершилась или потеряла источник. Действие: показать остановку, обновить интерфейс и спросить перед переключением.
В новом сценарии используйте минимально необходимую возможность. Объясните назначение, запрашивайте только нужный тип и проверьте путь при отказе. Затем проверьте отсутствующий или отключённый источник, изменение списка и корректную остановку. Событие devicechange позволяет перечитать список после подключения или отключения устройства, но не выдаёт разрешение и не запускает захват повторно. Сохраняйте одинаковый смысл на телефоне и компьютере, даже если браузер показывает разные диалоги. Просмотрите аналитику и журналы: сохраняйте только данные для работы сценария, не содержимое медиа и не весь список по умолчанию.
Для виртуальной камеры добавьте две проверки: внешнее приложение действительно выдаёт ожидаемую сцену, а браузер после согласия получил реальную выбранную дорожку. Первое не доказывает второе. Перед трансляцией подтвердите видимый источник и оставьте остановку доступной на протяжении сессии. Полезный итог - проверенный пользовательский результат, а не просто непустой массив перечисления.
Управление перечислением и ограничения BotBrowser
В документации BotBrowser --bot-media-devices описан как настройка того, как navigator.mediaDevices.enumerateDevices() сообщает аудио- и видеоустройства страницам. По умолчанию возвращается список устройств профиля, дополнительный флаг не требуется. Это помогает согласовать сообщаемый список с выбранным профилем, если от него зависит сценарий. BotBrowser контролирует перечень, сообщаемый страницам, но не создаёт виртуальную камеру, не выдаёт разрешения браузера или ОС и не гарантирует, что выбранный источник создаст MediaStream.
Сравнивайте записи MediaDeviceInfo отдельно от результата запроса getUserMedia({ video: true }): наличие источника в списке не подтверждает доступность потока. Страница и платформа продолжают применять обычные правила разрешения и захвата. Описывайте только фактически проверенный результат.
Таким образом, список устройств профиля может сделать поверхность обнаружения предсказуемой, но пользовательский сценарий по-прежнему отвечает за согласие, выбор источника, обработку сбоя захвата и остановку. Ясно обозначайте эти границы в интерфейсе и инструкциях поддержки.
Продолжение о Screen Capture
Screen Capture API добавляет выбранную пользователем поверхность экрана; сравните её жизненный цикл с этой границей перечисления в статье Screen Capture API: контроль пользователя и приватность.
Итоги
Проверяйте отдельно перечень, разрешение и доступность потока. Используйте управление перечнем на основе профиля BotBrowser только для согласования сообщаемого представления с нужным профилем; сохраняйте видимыми согласие пользователя, внешнее приложение виртуальной камеры, доступ ОС и остановку потока.
Источники
Эта статья входит в руководство: Что такое отпечаток браузера?
Похожие статьи
Permissions Policy, возможности браузера и приватность
ПлатформаScreen Capture API: контроль пользователя и приватность
ОтпечаткиAPI микрофона браузера: доступ, разрешения и запись
ОтпечаткиПоля отчёта BrowserLeaks WebRTC
ОтпечаткиОтчёт CreepJS WebRTC: происхождение полей
ОтпечаткиМогут ли passkeys создавать отпечаток? Границы WebAuthn
Выполните ту же проверку в BotBrowser
Загрузите профиль, сохраните внутри браузера те сигналы, о которых только что прочитали, и подтвердите результат на своей машине до раскатки.