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:
Un rapido controllo sul bundle conferma che lo stesso identificatore è dichiarato in più chunk:
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
identifiersPrefixunivoco per ciascun filePassare manualmente un prefisso diverso durante l'offuscamento di ogni file (ad esempio
identifiersPrefix: 'auth_'per uno echeckout_per un altro). È una soluzione efficace, ma soggetta a errori in presenza di molti file: è preferibile l'opzione casuale illustrata sopra.Impostare
identifierNamesGeneratorsuhexadecimalI 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-shufflede 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
randomIdentifiersPrefix— prefisso casuale per ogni build (consigliato)identifiersPrefix— stringa di prefisso esplicitaidentifierNamesGenerator— formato dei nomi (mangled,hexadecimal, …)
