Documentazione
/
Offuscamento VM
/

Comportamento di eval diretto

L'eval() diretto disattiva l'offuscamento VM

Se una funzione contiene una chiamata diretta eval(code) in qualsiasi punto del suo corpo (incluse le funzioni annidate), quella funzione viene esclusa dall'offuscamento VM e l'offuscatore segnala un avviso VMDynamicCodeSkipped (che indica la funzione quando ha un nome). In modalità root (quella predefinita) vengono escluse l'intera funzione e tutte le sue funzioni annidate; in modalità comment una funzione annidata che marchi separatamente viene comunque virtualizzata, a meno che non contenga essa stessa l'eval. Un eval diretto con un argomento non statico emette anche un avviso DynamicCodeRenameRisk. Questo perché l'eval diretto ha accesso alle variabili locali della funzione che lo racchiude, che non sono disponibili quando la funzione viene compilata in bytecode della VM.

Importante per il codice racchiuso in una IIFE. Se una IIFE di primo livello contiene un eval diretto, anche in profondità, l'intera IIFE (con tutto il tuo codice) non verrà offuscata dalla VM.

JavaScript

Rimuovere la IIFE comporta un compromesso: una volta che le tue funzioni si trovano al livello superiore, viene esclusa solo la funzione problematica, ma le funzioni rimanenti sono ora al livello radice, quindi l'offuscamento VM ne conserva i nomi. Consulta Nascondere i nomi delle funzioni all'analisi degli LLM per sapere come tenere quei nomi fuori dall'output.

Le forme indirette come (0, eval)(code) e window.eval(code) non bloccano l'offuscamento VM. eval?.(code) è un'eccezione: JavaScript lo esegue come eval indiretto, ma l'offuscatore lo tratta in modo conservativo come eval diretto ed esclude la funzione.

Il costruttore Function (new Function(body) / Function(body)) viene trattato allo stesso modo quando l'argomento del corpo è dinamico. Anche una funzione che contiene una chiamata dinamica new Function(...) viene esclusa, con un avviso VMDynamicCodeSkipped. Come per un eval diretto dinamico, l'offuscatore aggiunge un avviso DynamicCodeRenameRisk, perché il corpo costruito durante l'esecuzione può fare riferimento a identificatori rinominati. Le chiamate completamente statiche come new Function('a', 'b', 'return a + b') non vengono escluse.

L'eval indiretto e il costruttore Function vengono eseguiti nello scope globale. Non possono leggere le variabili locali del chiamante, ma possono comunque fallire se fanno riferimento a variabili globali rinominate o rimosse. Un corpo statico che usa solo i propri parametri, come new Function('a', 'b', 'return a + b'), evita questa dipendenza. Controlla gli avvisi e testa il bundle finale; cambiare soltanto la sintassi dell'eval non rende sicuro un codice dinamico arbitrario.

Via di fuga (v6.14.0+): imposta vmForceCompileDynamicCode: true (oppure attiva l'interruttore Force Compile Dynamic Code nel gruppo Override della sezione VM) per convertire comunque in bytecode la funzione circostante e sopprimere VMDynamicCodeSkipped. Non può riparare lo scope: all'interno di una funzione compilata forzatamente, l'eval diretto non può leggere né scrivere le variabili locali della funzione, i suoi parametri o le variabili di una funzione contenitrice virtualizzata, anche quando il codice è una stringa letterale. Usalo solo quando il codice valutato fa riferimento esclusivamente a variabili globali. DynamicCodeRenameRisk continua a essere emesso anche con questa opzione attiva, perché il rischio di rinominazione che descrive è indipendente dall'esclusione dalla VM.

Consulta Offuscamento VM con eval e new Function per la matrice completa, le forme degli avvisi e le soluzioni alternative.