Permisos WebHID y límites de privacidad del dispositivo
Solicita WebHID mediante una acción del usuario, valida colecciones e informes, gestiona desconexiones y limita los metadatos del dispositivo.
BotBrowser Team
Quieres la documentación estructurada de Plataforma?
Este artículo forma parte de la biblioteca editorial. Para pasos de configuración, material de referencia y actualizaciones continuas, entra en la sección de docs.
WebHID permite que una página solicite un dispositivo de interfaz humana elegido por la persona, pero el permiso no es un inventario ni prueba de propiedad. BotBrowser puede probar la rama de permiso de la página y su alternativa en un contexto controlado; no fabrica un controlador físico, concede permisos fuera del navegador ni demuestra E/S de hardware. El contrato seguro es explícito: preguntar tras una acción, inspeccionar solo las colecciones necesarias, limitar cada informe, reconciliar desconexiones y mantener la tarea usable sin HID.
TL;DR
navigator.hid.requestDevice({ filters: [{ usagePage: 0x01 }] })necesita un contexto seguro y activación transitoria del usuario.- Una concesión del selector expone un
HIDDevice; no demuestra conexión, seguridad, propiedad ni compatibilidad con todas las colecciones. - Inspecciona
device.collectionsantes de abrir y trata los bytes deinputreportcomo datos no confiables. disconnecttermina la relación actual; cierra listeners, conserva el trabajo y exige un reintento deliberado.- Guarda resultados como
granted,unsupportedodisconnected, no números de serie ni historial de informes.
Contenido
- Preguntar en el punto de uso
- Inspeccionar colecciones antes de los informes
- Limitar informes y reconciliar desconexiones
- Minimizar metadatos y conservar una alternativa
- Clasificar resultados con una tabla
- Capacidad y límite de BotBrowser
- Conclusión práctica
Preguntar en el punto de uso
WebHID está restringido a contextos seguros y requestDevice() debe ejecutarse durante la activación transitoria. Coloca la petición detrás de un control con nombre claro. La detección de funciones solo indica que existe un método; no abre un selector ni concede acceso. Una política del navegador, un iframe, el sistema operativo o la plataforma puede rechazarla.
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);
No abras el selector al cargar ni repitas tras una cancelación. Conserva el borrador y ofrece otra petición solo después de una acción nueva. Acceso WebUSB: permisos, interfaces y privacidad separa permiso, apertura, reclamación y limpieza. Permisos Web Bluetooth, elección de dispositivo y privacidad aplica el mismo límite de intención a otro modelo.
Inspeccionar colecciones antes de los informes
Tras elegir, HIDDevice expone metadatos y collections. Abre solo un dispositivo compatible y compara usagePage, usage y descriptores con la operación prevista. Un nombre de producto no autoriza todos los informes ni demuestra identidad, ubicación o proximidad.
Mantén una lista permitida de usos y tamaños de informe. Rechaza una colección incompatible en vez de pedir acceso más amplio. Evita copiar productName, vendorId, productId o serialNumber a URLs, cuentas, analítica o registros habituales: pueden distinguir una unidad aunque nunca se conozca a su propietario.
La colección es una vista viva. El dispositivo puede abrirse y fallar después, cambiar su diseño tras un firmware o desaparecer antes del primer informe. Describe la operación soportada y conserva la página normal si no aparece una colección adecuada.
Limitar informes y reconciliar desconexiones
inputreport entrega bytes del dispositivo elegido. Valida reportId, longitud, rangos y antigüedad antes de cambiar el estado. Define un máximo, rechaza IDs inesperados y limita la frecuencia antes de renderizar o enviar datos.
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);
Registra navigator.hid.addEventListener('disconnect', ...) y haz idempotente la limpieza. Marca la tarea como desconectada antes de esperar close(), elimina listeners, conserva datos y muestra reconexión deliberada. Un informe tardío no debe pintar la página como lista. No reconectes ni envíes automáticamente el último comando.
Minimizar metadatos y conservar una alternativa
Separa permiso, sesión HID y consentimiento de subida. Leer localmente no autoriza enviar a un servidor. Pregunta aparte, describe los campos que salen y deja terminar la tarea local si se rechaza la subida.
Un registro operativo suele necesitar unsupported, denied, no-device, connected, invalid-report o disconnected, además de fecha y entorno probado. Rara vez necesita informes crudos, identificadores estables o un mapa completo de colecciones. Las capturas de diagnóstico deben ser breves, visibles, controladas y eliminadas.
Conserva formulario, valor manual, archivo o configuración estática como alternativa accesible. No bloquees inicio de sesión, facturación, recuperación de cuenta ni contenido requerido por un HID físico.
Clasificar resultados con una tabla
| Etapa observada | Qué establece | Siguiente acción segura |
|---|---|---|
| API ausente, contexto inseguro o política | WebHID no puede iniciar aquí | Mantener la tarea sin HID y explicar el límite |
| Selector cancelado o permiso denegado | No hubo concesión utilizable | Conservar borrador y esperar una acción explícita |
| Dispositivo elegido pero colección incompatible | Falta la capacidad necesaria | Cerrar, mostrar requisitos y no ampliar filtros |
| Longitud, ID o rango inválido | El protocolo rechazó la entrada | Descartar, registrar invalid-report y continuar |
Evento disconnect | Terminó la relación actual | Quitar listeners, cerrar y ofrecer reintento deliberado |
| Informe válido y limitado | Se aceptó un valor de aplicación | Informar solo ese valor; no inferir identidad |
Cada fila debe terminar en un estado comprensible. Un permiso no es conexión, una colección no es confianza y un informe válido no prueba una acción física.
Capacidad y límite de BotBrowser
Los contextos controlados de BotBrowser pueden verificar botón de conexión, detección, filtrado de colecciones, informes limitados, limpieza por desconexión y alternativa sin HID. La documentación de funciones avanzadas describe capacidades revisables en ese contexto. El resultado sigue siendo evidencia de página: BotBrowser no suministra un dispositivo HID, concede permiso del sistema, garantiza un informe ni prueba que alguien posea o toque el controlador.
{
"api": "navigator.hid",
"permission": "denied",
"collectionsAccepted": 0,
"reportsAccepted": 0,
"rawIdentifiersRetained": false,
"physicalDevice": "not-asserted"
}
Repite el fixture al cambiar una variable: versión del navegador, política de contexto seguro, resultado del permiso, filtro o desconexión simulada. Compara la primera divergencia visible sin prometer soporte universal.
BotBrowser permite verificar el botón de conexión, el estado de permiso, el filtrado de colecciones y la limpieza de listeners dentro de un contexto controlado; no aporta el periférico físico ni garantiza un resultado eléctrico. Esa diferencia mantiene la evidencia de página separada de la aceptación de hardware.
BotBrowser puede validar los estados visibles de navigator.hid y su alternativa; BotBrowser no puede proporcionar el dispositivo HID ni confirmar una operación física.
Estados observables
La prueba conserva la secuencia visible y no convierte un resultado de página en una afirmación sobre hardware.
Límites de hardware
La aceptación física necesita un dispositivo aprobado y un entorno separado del fixture de la página.
Fuentes
Conclusión práctica
Usa una acción explícita, inspecciona colecciones soportadas, valida cada informe y cierra listeners al desconectar. Mantén la tarea completa sin HID y registra la etapa del fallo, no identificadores. Repite el fixture tras cambios de navegador, política, firmware o permiso; una prueba de página no promete hardware físico.
Este artículo forma parte de la guía: Superficies de la plataforma web: mapa de revisión
Artículos Relacionados
Permisos y ciclo de vida de puertos con Web Serial API
PlataformaWeb MIDI API: permisos y privacidad del dispositivo
IdentidadAcceso a dispositivos WebUSB: permisos, interfaces y privacidad
PlataformaWeb Share API: límites de permisos y respaldos seguros
PlataformaIdle Detection API: control, permisos y privacidad
PlataformaWindow Management API: límites entre varias pantallas
Lleva BotBrowser de la investigación a producción
Usa estas guías para entender el modelo y después avanzar hacia validación multiplataforma, contextos aislados y despliegue de navegador preparado para escalar.