Gestire le violazioni del codice ospitato da remoto

Il codice ospitato in remoto, o RHC, è ciò che nel Chrome Web Store chiama tutto ciò che venga eseguito dal browser caricato da un sistema diverso i file associati all'estensione. ad esempio JavaScript e WASM. Non include o elementi come JSON o CSS.

Perché RHC non è più consentito?

Con le estensioni Manifest V3 ora è necessario raggruppare tutto il codice utilizzato al suo interno l'estensione stessa. In passato, potevi inserire dinamicamente i tag di script qualsiasi URL sul web.

Mi è stato detto che la mia estensione ha RHC. Che cosa succede?

Se l'estensione è stata rifiutata durante la revisione con un errore Blue Argon: i nostri revisori ritengono che la tua estensione stia utilizzando codice ospitato in remoto. Questo è di solito è il risultato del tentativo da parte di un'estensione di aggiungere un tag script con un (ovvero dal web aperto, piuttosto che dai file inclusi nella (estensione) o di recuperare una risorsa da eseguire direttamente.

Come individuare RHC

Individuare l'RHC non è particolarmente difficile una volta che sai cosa cercare. Per prima cosa, verifica la presenza delle stringhe "http://" o "https://" nel tuo progetto. Se disponi di un violazione RHC, probabilmente sarai in grado di individuarli. Se disponi di un sistema di compilazione completo oppure utilizza le dipendenze di npm o di un altro di terze parti, assicurati di cercare la versione compilata del codice poiché è questo che viene valutato dal datastore. Se ancora non riesci a individua il problema, il passaggio successivo consiste nel contattare l'assistenza unificata. Loro sia in grado di indicare le violazioni specifiche e i requisiti necessari per l'estensione viene pubblicata il prima possibile.

Cosa fare se una libreria richiede il codice

Indipendentemente dalla provenienza del codice, non è consentito avere RHC. Questo include codice non creato da te, ma che viene utilizzato come dipendenza nel progetto. Alcuni sviluppatori che utilizzano Firebase hanno riscontrato questo problema durante la riproduzione da remoto il codice veniva incluso per l'utilizzo in Firebase Auth. Anche se si trattava di un libreria proprietaria (ovvero di proprietà di Google), non sono previste eccezioni per RHC. Ti servono per configurare il codice in modo da rimuovere l'RHC o aggiornare il tuo progetto in modo includi il codice per iniziare. Se si verifica un problema in cui non è tuo codice che sta caricando RHC, ma una libreria che stai usando, quindi il miglior corso è contattare l'autore della biblioteca. Comunicagli che sta succedendo, e chiedi una soluzione alternativa o degli aggiornamenti del codice per rimuoverlo.

E se non puoi aspettare un aggiornamento della raccolta

Alcune biblioteche inviano un aggiornamento quasi subito dopo aver ricevuto la notifica, ma altre persone potrebbero essere abbandonate o avere bisogno di tempo per risolvere il problema. In base a cosa si verifica nella violazione specifica, può non essere necessario attendere che sbloccare il dispositivo e completare la revisione con esito positivo. Esistono diverse disponibili per tornare a essere operativi in breve tempo.

Controlla il codice

Hai sicuro che il codice che sta causando la richiesta sia necessario? Se possibile potrebbe essere appena eliminato oppure una libreria che lo causa può essere rimosso, quindi il codice e il lavoro è terminato.

In alternativa, c'è un'altra libreria che offre le stesse funzionalità? Prova visitando npmjs.com, GitHub o altri siti per trovare altre opzioni che rispondono gli stessi casi d'uso.

Tremori di alberi

Se il codice che causa la violazione RHC non viene effettivamente utilizzato, potrebbe essere possono essere eliminati automaticamente con gli strumenti. Strumenti di creazione moderni come webpack, Rollup e Vite (solo per citarne alcuni) hanno una funzionalità chiamata scuotimento degli alberi. Una volta abilitata sul sistema di build, l'oscillazione degli alberi devi rimuovere eventuali percorsi di codice inutilizzati. Ciò significa che non solo disporrai di un del codice, ma anche una versione più snella e veloce. È importante è bene notare che non tutte le biblioteche possono essere scosse da alberi, ma molte sì. Alcune come Rollup e Vite, hanno la funzionalità Tree Shaking abilitata per impostazione predefinita. webpack deve essere configurato per poter essere abilitato. Se non utilizzi una build come parte della tua estensione, ma stai utilizzando librerie di codice, ti invitiamo a valutare l'aggiunta di uno strumento di creazione al flusso di lavoro. Costruire ti aiutano a scrivere progetti più sicuri, affidabili e facilmente gestibili.

Le specifiche su come implementare la falsificazione degli alberi dipendono dal tuo progetto specifico. Ma per fare un semplice esempio con la funzionalità di aggregazione, puoi aggiungere la falciatura degli alberi semplicemente per compilare il codice del progetto. Ad esempio, se hai un file che accede solo Firebase Auth, chiamato 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);
  }
});

Quindi tutto quello che dovete fare è dire al file di input di Rollup, un plug-in necessario carica i file dei nodi @rollup/plugin-node-resolve e il nome dell'output che sta generando.

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

Se esegui questo comando in una finestra del terminale, riceverai una versione generata dei nostri file main.js, tutti compilati in un unico file denominato compiled.js.

L'aggregazione può essere semplice, ma anche molto configurabile. Puoi aggiungere tutti i tipi di logica e configurazione complesse, consulta la loro documentazione. L'aggiunta di strumenti di creazione come questo comporterà un codice più piccolo e più efficiente, e, in questo caso, risolve il problema relativo al codice ospitato in remoto.

Modifica automatica dei file

Un modo sempre più comune in cui il codice ospitato in remoto può inserire il tuo codebase è come subdipendenza della libreria che includi. Se la raccolta X vuole libreria import Y di una CDN, dovrai comunque aggiornarla per creare viene caricato da un'origine locale. Con i moderni sistemi di compilazione, per estrarre un riferimento remoto e incorporarlo direttamente nel codice.

Ciò significa che il codice è simile al seguente:

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

Potresti creare un piccolo plug-in di aggregazione.

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 volta eseguita la build con il nuovo plug-in, ogni URL import remoto viene scoperto indipendentemente dal fatto che si tratti o meno del nostro codice, di una subdipendenza, subsubdependecy o in qualsiasi altro luogo.

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

Modifica manuale dei file

L'opzione più semplice consiste semplicemente nell'eliminare il codice che sta causando l'errore RHC. Apri in nell'editor di testo che preferisci ed elimina le righe in violazione. Generalmente si tratta non è consigliabile, perché è fragile e potrebbe essere dimenticato. Rende mantenere il tuo progetto più difficile quando un file chiamato "library.min.js" non è effettivamente libreria.min.js. Invece di modificare i file RAW, un po' più di tempo gestibile è l'utilizzo di uno strumento come patch-package. Questo è un super potente opzione che ti consente di salvare le modifiche in un file, anziché la . Si basa su file patch, lo stesso tipo di elemento è alla base di sistemi di controllo delle versioni come Git o Subversion. Devi solo modificare manualmente il codice in violazione, salvare il file diff e configurare patch-package con le modifiche che vuoi applicare. Puoi leggere un tutorial completo nel file Leggimi del progetto. Se applichi la patch a un progetto, abbiamo davvero ti invitiamo a contattare il progetto per richiedere che vengano apportate modifiche upstream. Mentre il pacchetto patch semplifica molto la gestione delle patch, niente è ancora meglio.

Cosa fare se il codice non viene utilizzato

Man mano che i codebase crescono, le dipendenze (o le dipendenze di...) possono mantenere i percorsi di codice che non vengono più utilizzati. Se una di queste sezioni include il codice per caricare o eseguire RHC, allora dovrà essere rimosso. it non importa se è obsoleta o inutilizzata. Se non viene utilizzato, dovrebbe essere o tramite l'applicazione di patch alla libreria per farla rimuovere.

Esiste una soluzione alternativa?

In generale no. RHC non consentito. Esiste, tuttavia, un numero limitato di nei casi in cui è consentito. Quasi sempre, si tratta di casi in cui impossibile per qualsiasi altra opzione.

API User Scripts

Gli script utente sono piccoli snippet di codice generalmente forniti per i gestori di script utente come TamperMonkey e Scimmia violenta. Questi amministratori non possono raggruppare il codice è scritto dagli utenti, quindi l'API User Script espone un modo per eseguire il codice forniti dall'utente. Questa funzione non sostituisce chrome.scripting.executeScript o altri ambienti di esecuzione di codice. Per eseguire qualsiasi cosa, gli utenti devono attivare la modalità sviluppatore. Se il browser Chrome Web Il team di revisione del negozio ritiene che venga utilizzato in un modo diverso destinato a (ovvero, codice fornito dall'utente), potrebbe essere rifiutato o scheda rimossa dallo store.

chrome.debugger

L'API chrome.debugger consente alle estensioni di interagire con il protocollo Chrome Devtools. Si tratta dello stesso protocollo utilizzato gli strumenti di sviluppo di Chrome e una serie di altri strumenti. con cui è possibile può richiedere ed eseguire codice remoto. Come per gli script utente, sostituisce chrome.scripting e offre un'esperienza utente molto più significativa. Durante l'utilizzo, l'utente vedrà una barra di avviso nella parte superiore del finestra. Se il banner viene chiuso o ignorato, la sessione di debug viene terminato.

Screenshot della barra degli indirizzi di Chrome con il messaggio "L'estensione debugger ha avviato il debug di questo browser"
Screenshot della barra degli indirizzi di Chrome con il messaggio "L'estensione debugger ha avviato il debug di questo browser"

iframe con sandbox

Se devi valutare una stringa come codice e ti trovi in un ambiente DOM (ad es. script dei contenuti, invece di un service worker di estensione), poi un'altra opzione consiste nell'utilizzare un iframe con sandbox. Le estensioni non supportano elementi quali eval() per impostazione predefinita come misura di sicurezza. Il codice dannoso potrebbe mettere alla sicurezza degli utenti e la sicurezza. Ma quando il codice viene eseguito solo in una come un iframe chiuso tramite sandbox dal resto del web, i rischi si riducono notevolmente. In questo contesto, il Content Security È possibile rimuovere il criterio che blocca l'uso di eval, consentendoti di eseguire qualsiasi un codice JavaScript valido.

Se un caso d'uso non rientra nei casi descritti, non esitare a contattare il team utilizzando la mailing list chromium-extensions per ricevere feedback o aprire una nuova ticket per richiedere indicazioni all'assistenza unificata

Cosa fare se non sei d'accordo con un esito

L'applicazione dei criteri può essere articolata e la revisione richiede l'input manuale, il che significa il team del Chrome Web Store a volte può accettare di cambiare una decisione relativa alla revisione. Se Se ritieni che sia stato commesso un errore durante la revisione, puoi presentare ricorso contro il rifiuto utilizzando l'assistenza unificata