Manifiesto: Recursos accesibles en la Web

Los recursos accesibles a través de la Web son archivos dentro de una extensión a los que se puede acceder a través de páginas web u otros extensiones. Por lo general, las extensiones utilizan esta función para exponer imágenes u otros elementos que se deben se cargan en las páginas web, pero cualquier recurso incluido en el paquete de una extensión se puede hacer accesible desde la Web.

De forma predeterminada, no se puede acceder a ningún recurso desde la Web, ya que esto permite que un sitio web malicioso haga una huella digital de las extensiones que instaló un usuario. o explotar vulnerabilidades (por ejemplo, errores de XSS) en extensiones instaladas. Solo las páginas o secuencias de comandos cargadas desde el origen de una extensión pueden acceder a sus recursos.

Declaración del manifiesto

Usa la propiedad web_accessible_resources del manifiesto para declarar qué recursos están expuestos y en cuáles son sus orígenes. Esta propiedad es un array de objetos que declara las reglas de acceso a los recursos. Cada objeto asigna un array de recursos de extensión a un array de URLs o IDs de extensión que pueden acceder a esos recursos.

{
  ...
  "web_accessible_resources": [
    {
      "resources": [ "test1.png", "test2.png" ],
      "matches": [ "https://web-accessible-resources-1.glitch.me/*" ]
    }, {
      "resources": [ "test3.png", "test4.png" ],
      "matches": [ "https://web-accessible-resources-2.glitch.me/*" ],
      "use_dynamic_url": true
    }
  ],
  ...
}

Cada objeto del array contiene los siguientes elementos:

"resources"
Es un array de cadenas, cada una de las cuales contiene una ruta de acceso relativa a un recurso determinado desde el directorio raíz de la extensión. Los recursos pueden contener asteriscos (*) para las coincidencias con comodines. Por ejemplo, "/images/*" expone todo el directorio images/ de la extensión de forma recursiva, mientras que "*.png" expone todos los archivos PNG.
"matches"
Un array de cadenas, cada una de las cuales contiene un patrón de coincidencia que especifica qué sitios pueden acceder a este conjunto de recursos. Solo se usa el origen para establecer coincidencias con las URLs. Los orígenes incluyen las coincidencias de subdominios. Google Chrome emite un "Patrón de coincidencia no válido". si el patrón tiene una ruta de acceso distinta de “/*”.
"extension_ids"
Es un array de cadenas, cada una de las cuales contiene el ID de una extensión que puede acceder a los recursos.
"use_dynamic_url"
Si es verdadero, solo permite que se acceda a los recursos a través de un ID dinámico. Se genera un ID dinámico por sesión. Esto significa que se vuelve a generar cuando se reinicia el navegador o se vuelve a cargar la extensión.

Cada elemento debe incluir un elemento "resources" y un elemento "matches" o "extension_ids". Esto establece una asignación que expone los recursos especificados a páginas web que coinciden con el patrón o a extensiones con IDs coincidentes. El elemento "use_dynamic_url" es opcional.

Los recursos están disponibles en una página web a través de la URL chrome-extension://[PACKAGE ID]/[PATH], que se puede generar con el método runtime.getURL(). Los recursos se entregan con los encabezados de CORS adecuados, por lo que están disponibles a través de fetch().

Se bloquea la navegación de un origen web a un recurso de extensión, a menos que el recurso se muestre como accesible a la Web. Ten en cuenta estos casos extremos:

  • Cuando una extensión usa la API de webRequest para redireccionar un sitio web una solicitud de recurso a un recurso al que no se puede acceder desde la Web, esa solicitud también se bloquea.
  • Lo anterior se aplica incluso si el recurso al que no se puede acceder desde la Web pertenece a la .
  • La navegación se bloquea en el modo Incógnito, a menos que el valor del campo "incognito" se establezca en "split".

No es necesario permitir las secuencias de comandos de contenido.

Ejemplo

En el ejemplo de recursos accesibles a la Web, se demuestra el uso de este elemento en una extensión en funcionamiento.