Qué hace
La cabecera HTTP Permissions-Policy indica al navegador qué funciones potentes de la web puede usar tu página — y cada iframe que incrustes. Cámara, micrófono, geolocalización, sensores, USB, captura de pantalla: por defecto cada una de ellas está disponible para tu propio origen, esperando a que un script la pida.
Esta herramienta convierte esa cabecera de una cadena tecleada a mano en un editor de directivas estructurado. Cada tarjeta de directiva nombra una función — las funciones conocidas llevan una insignia de impacto en la privacidad (alto / medio / bajo) y una nota sobre qué hace la función — y elige una allowlist: permitir en todas partes (*), solo el mismo origen (self), desactivada por completo (()), o una lista de orígenes personalizada. La cabecera se ensambla sola, en vivo, junto a los controles. Pega una cabecera existente para cargarla y editarla.
Cómo usarlo
- Empieza con un preset — All deny (todas las funciones del catálogo desactivadas), Camera self (
camera=(self)), o Fullscreen * (fullscreen=*). - Edita las tarjetas de directivas — escribe un nombre de función, elige su allowlist (
Off/Self/All/Origins) y, paraOrigins, da una lista de orígenes separada por espacios. Añade o elimina directivas libremente. - Pega una cabecera existente — despliega el panel de importación, pega tu valor actual de
Permissions-Policy, y Parse & load lo trae al editor (el prefijo del nombre de la cabecera y los orígenes entre comillas se gestionan; la entrada mal formada se informa). - Copia o descarga — copia la cabecera para la configuración de tu servidor / CDN, o descárgala como
permissions-policy.txt. - Comparte la configuración — tu lista completa de directivas se codifica en la URL de la página; copia la dirección para entregar a alguien la política exacta.
Ejemplos
Un valor por defecto estricto para un sitio que no necesita ninguna de estas APIs:
camera=(), display-capture=(), geolocation=(), hid=(), idle-detection=(),
microphone=(), serial=(), usb=(), xr-spatial-tracking=()
Incrustar un socio de vídeo que necesita cámara + micrófono solo en su propio frame:
camera=(https://partner.example.com), geolocation=(), microphone=(https://partner.example.com)
Conservar fullscreen y payment para ti mismo, todo lo demás bloqueado:
fullscreen=(self), payment=(self)
Buen saber
- Validación en vivo — la herramienta marca directivas duplicadas (solo la última sobrevive en la cabecera),
*en el trío sensible (camera,geolocation,microphone— todos los orígenes reciben el aviso de hardware) y nombres fuera del catálogo (errata, o una función que los navegadores aún no conocen — se ignora en silencio). - ¿Por qué bloquear funciones que nunca usas? Una función desactivada no puede ser reactivada por una dependencia comprometida, un script de anuncios rebelde o un iframe inyectado. También reduce tu superficie de fingerprinting — las APIs de sensores y batería son vectores clásicos de rastreo.
- La detección de funciones sigue funcionando. Los scripts que llaman a
navigator.mediaDevicessobre una función desactivada reciben una promesa rechazada en lugar de un aviso — ponallow="camera"solo en los iframes concretos que lo necesiten. - Esto no es CSP. Content-Security-Policy controla qué contenido se carga; Permissions-Policy controla qué hardware/APIs se pueden usar. Publica ambos.
- 100% en el cliente — la cabecera se construye en tu navegador; nada se sube.
- Herramientas relacionadas: CSP Builder, Basic Auth Generator.