Mejora de la seguridad en Manifest V3
Esta es la última de las tres secciones que describen los cambios necesarios para el código que no forma parte del service worker de la extensión. Describe los cambios necesarios para mejorar la seguridad de las extensiones. Las otras dos secciones abarcan la actualización del código necesaria para actualizar a Manifest V3 y el reemplazo de las solicitudes web de bloqueo.
Se quitó la ejecución de cadenas arbitrarias
Ya no puedes ejecutar lógica externa con executeScript(), eval() y new Function().
- Traslada todo el código externo (JS, Wasm, CSS) al paquete de la extensión.
- Actualiza las referencias de secuencias de comandos y estilos para cargar recursos desde el paquete de la extensión.
- Usa
browser.runtime.getURL()para compilar URLs de recursos en el tiempo de ejecución. - Usa un iframe con zona de pruebas:
evalynew Function(...)aún se admiten en los iframes con zona de pruebas. Para obtener más detalles, lee la guía sobre los iframe con zona de pruebas.
El método executeScript() ahora se encuentra en el espacio de nombres scripting en lugar del espacio de nombres tabs. Para obtener información sobre cómo actualizar las llamadas, consulta Cómo mover executeScript().
Existen algunos casos especiales en los que aún es posible ejecutar cadenas arbitrarias:
- Cómo insertar hojas de estilo alojadas de forma remota en una página web con insertCSS
- Para las extensiones que usan
browser.devtools: inspectWindow.eval permite ejecutar JavaScript en el contexto de la página inspeccionada. - Las extensiones del depurador pueden usar browser.debugger.sendCommand para ejecutar JavaScript en un destino de depuración.
Quita el código alojado de forma remota
En Manifest V3, toda la lógica de tu extensión debe formar parte del paquete de la extensión. Ya no puedes cargar ni ejecutar archivos alojados de forma remota según la política de Chrome Web Store. Los siguientes son algunos ejemplos:
- Son archivos JavaScript extraídos del servidor del desarrollador.
- Cualquier biblioteca alojada en una CDN
- Bibliotecas de terceros incluidas que recuperan de forma dinámica código alojado de forma remota.
Hay enfoques alternativos disponibles, según tu caso de uso y el motivo del alojamiento remoto. En esta sección, se describen los enfoques que se deben tener en cuenta. Si tienes problemas para trabajar con código alojado de forma remota, tenemos orientación disponible.
Funciones y lógica basadas en la configuración
Tu extensión carga y almacena en caché una configuración remota (por ejemplo, un archivo JSON) durante el tiempo de ejecución. La configuración almacenada en caché determina qué funciones están habilitadas.
Lógica externalizada con un servicio remoto
Tu extensión llama a un servicio web remoto. Esto te permite mantener el código privado y cambiarlo según sea necesario, a la vez que evitas la sobrecarga adicional de volver a enviar la extensión a Chrome Web Store.
Incorpora código alojado de forma remota en un iframe de zona de pruebas
El código alojado de forma remota se admite en iframes de zona de pruebas. Ten en cuenta que este enfoque no funciona si el código requiere acceso al DOM de la página incorporada.
Agrupa bibliotecas de terceros
Si usas un framework popular, como React o Bootstrap, que antes cargabas desde un servidor externo, puedes descargar los archivos minimizados, agregarlos a tu proyecto y, luego, importarlos de forma local. Por ejemplo:
<script src="./react-dom.production.min.js"></script>
<link href="./bootstrap.min.css" rel="stylesheet">
Para incluir una biblioteca en un service worker, establece la clave "background.type" en "module" en el manifiesto y usa una instrucción import.
Cómo usar bibliotecas externas en secuencias de comandos insertadas en pestañas
También puedes cargar bibliotecas externas en el tiempo de ejecución agregándolas al array files cuando llamas a scripting.executeScript(). Aún puedes cargar datos de forma remota en el tiempo de ejecución.
browser.scripting.executeScript({
target: {tabId: tab.id},
files: ['jquery-min.js', 'content-script.js']
});
Cómo inyectar una función
Si necesitas más dinamismo, la nueva propiedad func en scripting.executeScript() te permite insertar una función como una secuencia de comandos de contenido y pasar variables con la propiedad args.
let name = 'World!'; browser.tabs.executeScript({ code: `alert('Hello, ${name}!')` });
En un archivo de secuencia de comandos en segundo plano
async function getCurrentTab() {/* ... */} let tab = await getCurrentTab(); function showAlert(givenName) { alert(`Hello, ${givenName}`); } let name = 'World'; browser.scripting.executeScript({ target: {tabId: tab.id}, func: showAlert, args: [name], });
En el service worker en segundo plano
El repositorio de muestras de extensiones de Chrome contiene un ejemplo de inyección de funciones que puedes seguir paso a paso. En la referencia de cada función, se incluye un ejemplo de getCurrentTab().
Busca otras soluciones alternativas
Si los enfoques anteriores no te ayudan con tu caso de uso, es posible que debas encontrar una solución alternativa (es decir, migrar a otra biblioteca) o encontrar otras formas de usar la funcionalidad de la biblioteca. Por ejemplo, en el caso de Google Analytics, puedes cambiar al protocolo de medición de Google en lugar de usar la versión oficial de JavaScript alojada de forma remota, como se describe en nuestra guía de Google Analytics 4.
Actualiza la política de seguridad del contenido
El "content_security_policy" no se quitó del archivo manifest.json, pero ahora es un diccionario que admite dos propiedades: "extension_pages" y "sandbox".
{ ... "content_security_policy": "default-src 'self'" ... }
{ ... "content_security_policy": { "extension_pages": "default-src 'self'", "sandbox": "..." } ... }
extension_pages: Se refiere a los contextos de tu extensión, incluidos los archivos HTML y los service workers.
sandbox: Se refiere a cualquier página de extensión en zona de pruebas que use tu extensión.
Quita las políticas de seguridad del contenido no admitidas
Manifest V3 no permite ciertos valores de la política de seguridad de contenido en el campo "extension_pages" que sí se permitían en Manifest V2. Específicamente, Manifest V3 no permite aquellos que permiten la ejecución remota de código. Las directivas script-src,, object-src y worker-src solo pueden tener los siguientes valores:
selfnonewasm-unsafe-eval- Solo extensiones sin empaquetar: Cualquier fuente de localhost (
http://localhost,http://127.0.0.1o cualquier puerto en esos dominios)
Los valores de la política de seguridad del contenido para sandbox no tienen restricciones nuevas de este tipo.