Разрешение WebHID и границы приватности устройства
Запрашивайте WebHID действием пользователя, проверяйте коллекции и отчёты, обрабатывайте отключения и ограничивайте метаданные устройства.
BotBrowser Team
Нужна структурированная документация по теме Платформа?
Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.
WebHID позволяет странице запросить выбранное человеком HID-устройство, но разрешение не является инвентарём и не доказывает владение. BotBrowser может проверить ветку разрешения страницы и запасной путь в управляемом контексте; он не создаёт физический контроллер, не выдаёт разрешение вне браузера и не доказывает аппаратный ввод-вывод. Безопасный контракт прост: запрашивать после действия, проверять только нужные коллекции, ограничивать каждый отчёт, согласовывать отключения и сохранять задачу без HID.
TL;DR
navigator.hid.requestDevice({ filters: [{ usagePage: 0x01 }] })требует защищённый контекст и кратковременную активацию пользователя.- Разрешение селектора открывает
HIDDevice, но не доказывает подключение, безопасность, владельца или пригодность всех коллекций. - Проверяйте
device.collectionsдо открытия и считайте байтыinputreportнедоверенными данными. disconnectзавершает текущую связь; закройте listeners, сохраните работу и потребуйте осознанный повтор.- Храните результаты
granted,unsupportedилиdisconnected, а не серийные номера и историю отчётов.
Содержание
- Запрашивайте в момент использования
- Проверяйте коллекции до отчётов
- Ограничивайте отчёты и согласуйте отключения
- Минимизируйте метаданные и сохраняйте запасной путь
- Классифицируйте результаты таблицей
- Возможность и ограничение BotBrowser
- Итог
Запрашивайте в момент использования
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 после изменений браузера, политики, прошивки или разрешения; успех страницы не обещает поведения физического устройства.
Эта статья входит в руководство: Поверхности веб-платформы: карта проверки
Похожие статьи
Разрешения Web Serial и жизненный цикл порта
ПлатформаWeb MIDI API: разрешения и приватность устройств
ИдентичностьДоступ к устройствам WebUSB: разрешения, интерфейсы и приватность
ПлатформаWeb Share API: границы разрешений и безопасные запасные варианты
ПлатформаIdle Detection API: контроль, разрешения и приватность
ПлатформаWindow Management API: границы нескольких экранов
Переведите BotBrowser из исследований в продакшн
Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.