Назад в Центр знаний
Платформа

Разрешение WebHID и границы приватности устройства

Запрашивайте WebHID действием пользователя, проверяйте коллекции и отчёты, обрабатывайте отключения и ограничивайте метаданные устройства.

BotBrowser Team

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

Нужна структурированная документация по теме Платформа?

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

WebHID позволяет странице запросить выбранное человеком HID-устройство, но разрешение не является инвентарём и не доказывает владение. BotBrowser может проверить ветку разрешения страницы и запасной путь в управляемом контексте; он не создаёт физический контроллер, не выдаёт разрешение вне браузера и не доказывает аппаратный ввод-вывод. Безопасный контракт прост: запрашивать после действия, проверять только нужные коллекции, ограничивать каждый отчёт, согласовывать отключения и сохранять задачу без HID.

Действие пользователя, граница разрешения WebHID, проверка коллекций, ограниченные отчёты, очистка после отключения и запасной путь

TL;DR

  • navigator.hid.requestDevice({ filters: [{ usagePage: 0x01 }] }) требует защищённый контекст и кратковременную активацию пользователя.
  • Разрешение селектора открывает HIDDevice, но не доказывает подключение, безопасность, владельца или пригодность всех коллекций.
  • Проверяйте device.collections до открытия и считайте байты inputreport недоверенными данными.
  • disconnect завершает текущую связь; закройте listeners, сохраните работу и потребуйте осознанный повтор.
  • Храните результаты granted, unsupported или disconnected, а не серийные номера и историю отчётов.

Содержание

Запрашивайте в момент использования

WebHID работает только в защищённых контекстах, а requestDevice() следует запускать во время краткой активации. Поместите запрос за понятной кнопкой. Проверка функции показывает лишь наличие метода, но не открывает селектор и не выдаёт доступ. Политика браузера, iframe, ОС или платформа всё равно могут отклонить запрос.

async function connectHid() {
  if (!window.isSecureContext || !navigator.hid) return showHidState('unsupported');
  setHidState('requesting');
  try {
    const devices = await navigator.hid.requestDevice({
      filters: [{ usagePage: 0x01, usage: 0x06 }],
    });
    if (devices.length === 0) return showHidState('no-device');
    await openSelectedHid(devices[0]);
  } catch (error) {
    showHidState(error.name === 'NotAllowedError' ? 'denied' : 'failed');
  }
}

connectButton.addEventListener('click', connectHid);

Не открывайте селектор при загрузке и не повторяйте запрос после отмены. Сохраните черновик и предложите новый запрос только после нового действия. Доступ WebUSB: разрешения, интерфейсы и приватность отделяет разрешение от открытия, захвата и очистки. Разрешения Web Bluetooth, выбор устройства и приватность применяет тот же предел намерения к другой модели устройств.

Проверяйте коллекции до отчётов

После выбора HIDDevice открывает метаданные и collections. Открывайте только поддержанное устройство и сравнивайте usagePage, usage и дескрипторы с требуемой операцией. Имя продукта не разрешает все отчёты и не доказывает личность, место или близость.

Составьте список разрешённых назначений и размеров отчётов. Отклоняйте неподходящую коллекцию вместо расширения доступа. Не копируйте productName, vendorId, productId или serialNumber в URL, аккаунты, аналитику или обычные журналы: они могут различать экземпляры без сведений о владельце.

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

Ограничивайте отчёты и согласуйте отключения

inputreport передаёт байты выбранного устройства. Проверяйте reportId, длину, диапазоны и свежесть до изменения состояния. Задайте максимум, отклоняйте неожиданные ID и ограничивайте частоту перед отрисовкой или отправкой.

const MAX_REPORT_BYTES = 64;

function acceptInputReport(event) {
  const bytes = new Uint8Array(event.data.buffer);
  if (bytes.length === 0 || bytes.length > MAX_REPORT_BYTES) return;
  if (event.reportId !== 1 || bytes[0] > 100) return;
  updateControllerState({ reportId: event.reportId, value: bytes[0] });
}

device.addEventListener('inputreport', acceptInputReport);

Зарегистрируйте navigator.hid.addEventListener('disconnect', ...) и сделайте очистку идемпотентной. Пометьте задачу отключённой до ожидания close(), удалите listeners, сохраните данные и покажите осознанное переподключение. Поздний отчёт не должен вернуть странице статус готовности. Не переподключайтесь и не отправляйте последнюю команду автоматически.

Минимизируйте метаданные и сохраняйте запасной путь

Разделяйте разрешение браузера, HID-сессию и согласие на загрузку. Локальное чтение не разрешает отправку на сервер. Спросите отдельно, опишите уходящие поля и позвольте завершить локальную задачу при отказе.

Обычно журналу достаточно unsupported, denied, no-device, connected, invalid-report или disconnected, времени и окружения. Сырые отчёты, стабильные идентификаторы и полная карта коллекций почти никогда не нужны. Диагностическая запись должна быть короткой, видимой, защищённой и удаляемой.

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

Классифицируйте результаты таблицей

Наблюдаемая стадияЧто установленоБезопасное действие
API отсутствует, контекст небезопасен или политика блокируетWebHID здесь не запускаетсяСохранить задачу без HID и объяснить ограничение
Селектор отменён или разрешение отклоненоДля этой попытки нет доступаСохранить черновик и ждать явного действия
Устройство выбрано, но коллекция не поддерживаетсяНужная возможность отсутствуетЗакрыть сессию, показать требования, не расширять фильтры
Неверны длина, ID или диапазонВход не прошёл протоколОтбросить, записать invalid-report, продолжить
Событие disconnectТекущая связь завершиласьУдалить listeners, закрыть, сохранить данные, предложить повтор
Валидный ограниченный отчётСтраница приняла одно значениеСообщить только значение, не выводить личность

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

Возможность и ограничение BotBrowser

Управляемые контексты BotBrowser могут проверить кнопку подключения, обнаружение API, фильтрацию коллекций, ограниченные отчёты, очистку после отключения и запасной путь без HID. Документация расширенных возможностей описывает такие проверки. Это всё ещё свидетельство страницы: BotBrowser не предоставляет HID-устройство, не выдаёт разрешение ОС, не гарантирует отчёт и не доказывает владение или прикосновение к контроллеру.

{
  "api": "navigator.hid",
  "permission": "denied",
  "collectionsAccepted": 0,
  "reportsAccepted": 0,
  "rawIdentifiersRetained": false,
  "physicalDevice": "not-asserted"
}

Повторите fixture после изменения одной переменной: версии браузера, политики защищённого контекста, результата разрешения, фильтра коллекции или смоделированного отключения. Сравнивайте первое видимое расхождение, не обещая универсальную поддержку оборудования.

Наблюдаемые состояния

Тест сохраняет видимую последовательность и не превращает результат страницы в утверждение об оборудовании.

Границы оборудования

Физическая приёмка требует утверждённого устройства и отдельного от фикстуры окружения.

Источники

Итог

Используйте явное действие, проверяйте поддержанные коллекции, валидируйте каждый отчёт и закрывайте listeners после отключения. Сохраняйте задачу полноценной без HID и записывайте стадию ошибки вместо идентификаторов. Повторяйте fixture после изменений браузера, политики, прошивки или разрешения; успех страницы не обещает поведения физического устройства.

#WebHID#Разрешения#Приватность Устройства#API Браузера#BotBrowser

Эта статья входит в руководство: Поверхности веб-платформы: карта проверки

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

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