Cómo abordar incumplimientos de código alojados de manera remota

Chrome Web Store llama a cualquier código alojado de forma remota, o RHC, cualquier es ejecutado por el navegador que se carga desde un lugar que no sea propios archivos de la extensión. por ejemplo, JavaScript y WASM. No incluye datos o elementos como JSON o CSS.

¿Por qué ya no se permite el RHC?

Con las extensiones de Manifest V3, ahora es necesario agrupar todo el código que usan dentro la extensión en sí. Antes, podías insertar dinámicamente etiquetas de secuencias de comandos cualquier URL en la Web.

Me dijeron que mi extensión tiene RHC. ¿Qué sucede?

Si se rechazó la extensión durante la revisión debido a un error de Blue Argon, entonces nuestros revisores creen que tu extensión usa código alojado de forma remota. Este es generalmente el resultado de una extensión que intenta agregar una etiqueta de secuencia de comandos con un control remoto (es decir, de la Web abierta, en lugar de los archivos incluidos en la o la recuperación de un recurso para ejecutarlo directamente.

Cómo detectar RHC

Detectar la RHC no es particularmente difícil una vez que sabes qué buscar. Primero, busca las cadenas "http://" o “https://” en tu proyecto. Si tienes un Infracción de RHC, entonces es probable que puedas localizarlos allí. Si tienes un sistema de compilación completo o usas dependencias de npm o de otros servicios de terceros, asegúrate de buscar la versión compilada del código ya que eso es lo que la tienda evalúa. Si aún no puedes el problema, el siguiente paso es comunicarse con el equipo de asistencia integral. Ellas podrá describir las infracciones específicas y qué se necesita se publicará la extensión lo antes posible.

Qué hacer si una biblioteca solicita el código

Sin importar de dónde provenga el código, no se permite tener RHC. Esta incluye código que tú no creaste, pero que usas como dependencia en tu en un proyecto final. Algunos desarrolladores que usan Firebase tuvieron este problema cuando código para usarlo en Firebase Auth. Aunque se trataba de un biblioteca propia (es decir, propiedad de Google); no se hace ninguna excepción para RHC. Necesitas para configurar el código de modo que quite el RHC o actualice su proyecto para que incluir el código desde el principio. Si encuentras un problema en el que no es tu código que está cargando RHC, pero una biblioteca que estés usando, el mejor curso de acción es contactar al autor de la biblioteca. Hazles saber que esto está sucediendo, y solicite una solución alternativa o actualizaciones de código para quitarla.

¿Qué sucede si no puedes esperar a una actualización de la biblioteca?

Algunas bibliotecas enviarán una actualización casi inmediatamente después de recibir la notificación, pero otros podrían abandonarse o tomarse el tiempo para solucionar el problema. Dependiendo de qué en el incumplimiento específico, es posible que no deba esperar a que se desbloquee y complete una revisión exitosa. Existen varias disponibles para volver a usarla rápidamente.

Audita el código

¿Estás seguro de que el código que genera la solicitud es necesario? Si es posible, solo se puede borrar, o bien se puede quitar la biblioteca que lo ocasiona, y, luego, ese código, y el trabajo está terminado.

¿Hay otra biblioteca que ofrezca las mismas funciones? Probar verificando npmjs.com, GitHub y otros sitios para encontrar otras opciones que satisfagan los mismos casos de uso.

Movimiento de árboles

Si el código que causa la infracción de RHC no se usa realmente, es posible que que las herramientas puedan borrar automáticamente. Las herramientas de compilación modernas, como webpack, Rollup y Vite (por nombrar algunas) tienen una función. llamada eliminación de árboles. Una vez habilitada en tu sistema de compilación, la eliminación de código no utilizado debe quitar las instrucciones de código que no se usen. Esto puede significar que no solo tienes un una versión de tu código que cumpla con los requisitos, pero también una más rápida y eficiente. Es importante hay que tener en cuenta que no todas las bibliotecas pueden ser sacudidas, pero muchas sí. Algunos como Rollup y Vite, tienen habilitada la eliminación de código no utilizado de forma predeterminada. webpack se debe configurar para que se habilite. Si no usas una compilación como parte de la extensión, pero usan bibliotecas de código, a investigar cómo agregar una herramienta de compilación a tu flujo de trabajo. Compilación te ayudan a escribir proyectos más seguros, confiables y que se puedan mantener.

Los detalles para implementar la técnica de “treehaking” dependen de tu proyecto específico. Para analizar un ejemplo simple con Rollup, puedes agregar la compilando el código de tu proyecto. Por ejemplo, si tienes un archivo que solo accede Firebase Auth, llamada main.js:

import { GoogleAuthProvider, initializeAuth } from "firebase/auth";

chrome.identity.getAuthToken({ 'interactive': true }, async (token) => {
  const credential = GoogleAuthProvider.credential(null, token);
  try {
    const app = initializeApp({ ... });
    const auth = initializeAuth(app, { popupRedirectResolver: undefined, persistence: indexDBLocalPersistence });
    const { user } = await auth.signInWithCredential(credential)
    console.log(user)
  } catch (e) {
    console.error(error);
  }
});

Luego, solo debes indicarle a Rollup el archivo de entrada, un complemento necesario para carga los archivos de nodo @rollup/plugin-node-resolve y el nombre del resultado. el archivo que está generando.

npx rollup --input main.js --plugin '@rollup/plugin-node-resolve' --file compiled.js

Si ejecutas ese comando en una ventana de terminal, recibirás una versión generada de nuestro archivo main.js, compilados en un solo archivo llamado compiled.js.

Una fusión puede ser simple, pero también es muy configurable. Puedes agregar todos los tipos de lógica y configuración complejas, solo consulta su documentación. Agregar herramientas de compilación como esta generará un código más pequeño y eficiente, y, en este caso, soluciona nuestro problema con el código alojado de forma remota.

Edita archivos automáticamente

Una forma cada vez más común en que el código alojado de forma remota puede ingresar a tu base de código es como una subdependencia de una biblioteca que incluyas. Si la biblioteca X quiere import de la biblioteca Y de una CDN, deberás actualizarla para que se cargan desde una fuente local. Con los sistemas de compilación modernos, puedes crear fácilmente complementos para extraer una referencia remota y, luego, integrarla directamente en tu código.

Eso significaría que, en un código dado, se ve de la siguiente manera:

import moment from "https://unpkg.com/moment@2.29.4/moment.js"
console.log(moment())

Podrías crear un pequeño complemento de fusión de canales.

import { existsSync } from 'fs';
import fetch from 'node-fetch';

export default {
  plugins: [{
    load: async function transform(id, options, outputOptions) {
      // this code runs over all of out javascript, so we check every import
      // to see if it resolves as a local file, if that fails, we grab it from
      // the network using fetch, and return the contents of that file directly inline
      if (!existsSync(id)) {
        const response = await fetch(id);
        const code = await response.text();

        return code
      }
      return null
    }
  }]
};

Una vez que ejecutes la compilación con el nuevo complemento, cada URL remota import se descubierto independientemente de si se trataba o no de nuestro código, de una subdependencia, subsubdependencia o cualquier otro lugar.

npx rollup --input main.js --config ./rollup.config.mjs --file compiled.js

Editar archivos manualmente

La opción más simple es borrar el código que causa el RHC. Abrir en el editor de texto que prefieras y borra las líneas que infrinjan las políticas. Por lo general, es No es recomendable, ya que es frágil y podría olvidarse. Esto hace que a mantener tu proyecto con más esfuerzo cuando un archivo llamado "library.min.js" no es actually library.min.js. En lugar de editar los archivos sin procesar, es posible que debas fácil de mantener es usar una herramienta como patch-package. Este es un super potente opción que te permite guardar las modificaciones en un archivo, en lugar de las . Se basa en archivos de parche, el mismo tipo de elementos que potencia sistemas de control de versión como Git o Subversion. Solo necesitas modificar manualmente el código que infringe las políticas, guardar el archivo de diferencias y configurar parche-paquete con los cambios que quieras aplicar. Puedes leer un instructivo completo en el archivo readme del proyecto. Si estás aplicando parches a un proyecto, en verdad alentarte a que te comuniques con el proyecto para solicitar que se realicen cambios directo. Si bien el paquete de parche facilita mucho la administración de los parches, tener nada de lo que se pondrá es mucho mejor.

Qué hacer si no se usa el código

A medida que crecen las bases de código, las dependencias (o la dependencia de una dependencia o dependencia de...) pueden conservar las instrucciones de código que ya no se usan. Si una de esas secciones incluya código para cargar o ejecutar RHC, entonces tendrá que quitarlo. Integra no importa si está muerta o sin usar. Si no se usa, debe ser mediante la extracción de árboles o un parche para la biblioteca.

¿Existe alguna solución alternativa?

En términos generales, no. No se permite RHC. Sin embargo, hay una pequeña cantidad de casos en los que lo permite. Estos son casi siempre casos en los que imposible para cualquier otra opción.

API de User Scripts

Las secuencias de comandos de usuario son pequeños fragmentos de código que suele proporcionar el usuario, diseñado para administradores de secuencias de comandos de usuario como TamperMonkey y Violentmonkey. Estos administradores no pueden agrupar códigos que lo escriben los usuarios, por lo que la API de User Script expone una forma de ejecutar código proporcionadas por el usuario. Esto no reemplaza el chrome.scripting.executeScript o algún otro entorno de ejecución de código. Los usuarios deben habilitar el modo de desarrollador para ejecutar cualquier tarea. Si la versión web de Chrome El equipo de revisión de la tienda cree que se usa de otra forma para el que se creó (es decir, código proporcionado por el usuario), se puede rechazar o de la ficha de Play Store se eliminó de la tienda.

chrome.debugger

La API de chrome.debugger ofrece a las extensiones la capacidad de interactuar con el protocolo de Herramientas para desarrolladores de Chrome. Este es el mismo protocolo que se usa para Herramientas para desarrolladores de Chrome y una increíble cantidad de otras herramientas. Con él, se puede puede solicitar y ejecutar un código remoto. Al igual que las secuencias de comandos de usuario, es un sustituto de chrome.scripting y ofrece una experiencia del usuario más notable. Mientras se usa, el usuario verá una barra de advertencia en la parte superior de la en la ventana modal. Si se cierra o descarta el banner, se ejecutará la sesión de depuración. o cerrarse.

Captura de pantalla de la barra de direcciones en Chrome que tiene el mensaje "Debugger Extension started debugging this browser" (La extensión de Debugger comenzó a depurar este navegador).
Captura de pantalla de la barra de direcciones en Chrome que tiene el mensaje "Debugger Extension started debugging this browser".

iframes de zona de pruebas

Si necesitas evaluar una cadena como código y estás en un entorno de DOM (p.ej., de usar la secuencia de comandos de contenido, en lugar de un service worker de extensión), es usar un iframe de zona de pruebas. Las extensiones no admiten las siguientes acciones: eval() de forma predeterminada como precaución. El código malicioso podría poner la seguridad del usuario y la seguridad en riesgo. Pero cuando el código solo se ejecuta en una red segura como un iframe que se alojó en una zona de pruebas del resto de la Web, esos riesgos se reducen mucho. En este contexto, el equipo de La política que bloquea el uso de eval se puede levantar, lo que te permite ejecutar cualquier código JavaScript válido.

Si tienes un caso de uso que no está cubierto, no dudes en comunicarte con el equipo mediante la lista de distribución chromium-extensions para obtener comentarios o abre una nueva ticket para solicitar orientación al equipo de asistencia integral

Qué hacer si no estás de acuerdo con un veredicto

La aplicación de políticas puede tener matices y la revisión implica una entrada manual, lo que significa es posible que el equipo de Chrome Web Store acuerde cambiar una decisión tomada a partir de una opinión. Si Si crees que se trata de un error durante la revisión, puedes apelar el rechazo. con la asistencia integral