Mejora la seguridad de las extensiones

Mejora de la seguridad en Manifest V3

Esta es la última de 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 necesario para actualizar a Manifest V3 y reemplazar las solicitudes web de bloqueo.

Quita la ejecución de cadenas arbitrarias

Ya no puedes ejecutar lógica externa con executeScript(), eval() y new Function().

  • Mueve todo el código externo (JS, Wasm, CSS) al paquete de extensiones.
  • Actualiza las referencias de secuencias de comandos y estilos para cargar recursos desde el paquete de extensiones.
  • Usa chrome.runtime.getURL() para compilar URLs de recursos en el tiempo de ejecución.
  • Usa un iframe de zona de pruebas: eval y new Function(...) aún son compatibles con iframes de zona de pruebas. Para obtener más detalles, lee la guía sobre iframes de zona de pruebas.

El método executeScript() ahora está en el espacio de nombres scripting en lugar del espacio de nombres tabs. Para obtener información sobre la actualización de llamadas, consulta Cómo mover executeScript().

Existen algunos casos especiales en los que aún es posible ejecutar cadenas arbitrarias:

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 extensiones. 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:

  • Archivos de JavaScript extraídos del servidor del desarrollador
  • Cualquier biblioteca alojada en una CDN.
  • Bibliotecas de terceros agrupadas que recuperan de forma dinámica el código alojado de forma remota

Existen enfoques alternativos disponibles, según tu caso de uso y el motivo del alojamiento remoto. En esta sección, se describen los enfoques que debes 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) en 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, al mismo tiempo que evitas la sobrecarga adicional de volver a enviarlo 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 es compatible con 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 de incorporación.

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, configura la "background.type" clave en "module" en el manifiesto y usa una import instrucción.

Usa 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.

chrome.scripting.executeScript({
  target: {tabId: tab.id},
  files: ['jquery-min.js', 'content-script.js']
});

Inserta 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.

Manifest V2
let name = 'World!';
chrome.tabs.executeScript({
  code: `alert('Hello, ${name}!')`
});

En un archivo de secuencia de comandos en segundo plano

Manifest V3
async function getCurrentTab() {/* ... */}
let tab = await getCurrentTab();

function showAlert(givenName) {
  alert(`Hello, ${givenName}`);
}

let name = 'World';
chrome.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 inserción de funciones que puedes seguir. En la reference de esa 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 una biblioteca diferente) 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

No se quitó "content_security_policy" del archivo manifest.json, pero ahora es un diccionario que admite dos propiedades: "extension_pages" y "sandbox".

Manifest V2
{
  ...
  "content_security_policy": "default-src 'self'"
  ...
}
Manifest V3
{
  ...
  "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 las páginas de extensión de zona de pruebas que usa tu extensión.

Quita las políticas de seguridad del contenido no compatibles

Manifest V3 no permite ciertos valores de política de seguridad del contenido en el campo "extension_pages" que se permitían en Manifest V2. En particular, Manifest V3 no permite aquellos que permiten la ejecución de código remoto. Las directivas script-src, object-src y worker-src solo pueden tener los siguientes valores:

  • self
  • none
  • wasm-unsafe-eval
  • Solo extensiones sin empaquetar: cualquier fuente de localhost (http://localhost, http://127.0.0.1, o cualquier puerto en esos dominios)

Los valores de la política de seguridad del contenido para sandbox no tienen esas restricciones nuevas.