Documentazione
/
Ricette
/

Evitare le collisioni di identificatori

Evitare le collisioni di identificatori tra file offuscati

Quando più file offuscati con VM confluiscono nello stesso bundle, possono dichiarare lo stesso identificatore di primo livello e far fallire la pagina già in fase di parsing. Di seguito si illustrano le cause del problema e le relative soluzioni.

Il sintomo

La build viene completata correttamente, ma il browser genera un errore in fase di parsing, prima ancora che l'applicazione si avvii:

browser console

Errore

Un rapido controllo sul bundle conferma che lo stesso identificatore è dichiarato in più chunk:

terminal

Shell

Perché accade

Per impostazione predefinita l'offuscamento VM utilizza il generatore di nomi di identificatori mangled-shuffled, che percorre un alfabeto ridotto secondo un ordine mescolato ma deterministico e antepone il prefisso vm alle variabili globali introdotte dal runtime. Entrambi i file producono identificatori a partire dalla stessa sequenza mescolata: la prima variabile globale di ciascun file condivide quindi lo stesso nome, la seconda ne condivide un altro e così via.

Ogni file viene offuscato in modo indipendente e per ciascuno il generatore riparte dall'inizio della propria sequenza. Quando due file finiscono nello stesso bundle i nomi entrano in conflitto: due dichiarazioni const vmd = … di primo livello si trovano nello stesso scope e il parser rifiuta la seconda.

Soluzioni

Scegliere una delle seguenti soluzioni; la prima è quella consigliata:

  • Attivare randomIdentifiersPrefix (consigliato)

    A ogni esecuzione dell'offuscamento viene anteposto un prefisso casuale univoco a tutti gli identificatori generati. I nomi provenienti da file diversi non condividono più lo stesso namespace, così le collisioni scompaiono senza dover coordinare manualmente i prefissi.

  • Impostare un identifiersPrefix univoco per ciascun file

    Passare manualmente un prefisso diverso durante l'offuscamento di ogni file (ad esempio identifiersPrefix: 'auth_' per uno e checkout_ per un altro). È una soluzione efficace, ma soggetta a errori in presenza di molti file: è preferibile l'opzione casuale illustrata sopra.

  • Impostare identifierNamesGenerator su hexadecimal

    I nomi esadecimali utilizzano uno spazio di chiavi molto più ampio, per cui la probabilità che due file producano lo stesso identificatore è pressoché nulla. Il compromesso: gli identificatori sono più lunghi rispetto a quelli prodotti da mangled-shuffled e il bundle risulta quindi leggermente più grande.

  • Utilizzare un plugin per bundler oppure l'interfaccia di elaborazione multi-file

    La maggior parte dei plugin ufficiali per bundler (webpack, Rollup, Vite) garantisce automaticamente l'univocità dei prefissi tra i file di una stessa build. Anche l'interfaccia di obfuscator.io se ne occupa quando si utilizza l'offuscamento in blocco di più file. Se invece l'offuscamento viene configurato manualmente tramite l'API npm, occorre attivare esplicitamente il prefisso casuale.

Opzioni correlate