eval()
esegue una stringa di caratteri come codice. Si utilizza eval()
precisamente perché il contenuto della stringa non è noto in anticipo, o anche generato lato server; in sostanza, hai bisogno di eval()
perché lo stesso JavaScript genererà la stringa da dati che sono disponibili solo dinamicamente, nel client.
Pertanto, eval()
ha senso nelle situazioni in cui il codice JavaScript genera codice. Questo non è intrinsecamente evil , ma è difficile da fare in modo sicuro. I linguaggi di programmazione sono progettati per consentire all'essere umano di scrivere istruzioni che un computer comprende; a tal fine, qualsiasi linguaggio è pieno di piccole stranezze e comportamenti speciali che dovrebbero aiutare il programmatore umano (ad esempio l'aggiunta automatica di ";" alla fine di alcune istruzioni in JavaScript). Questo è tutto bello e dandy per la programmazione "normale"; ma quando generi codice da un altro programma, basato su dati che potrebbero essere potenzialmente ostili (ad es. estratto di stringa da altri utenti del sito), allora devi, come sviluppatore del generatore di codice, sapere < em> tutti queste stranezze e impedisci ai dati ostili di sfruttarli in modi dannosi.
In questo senso, i generatori di codice (e quindi eval()
) sostengono gli stessi problemi concettuali di SQL grezzo e la sua conseguenza, Attacchi SQL injection . Assemblando in fase di esecuzione una richiesta SQL da parametri forniti dall'esterno può essere eseguita in modo sicuro, ma ciò richiede un sacco di dettagli, quindi il solito consiglio è di non farlo. Ciò si riferisce al solito enigma di sicurezza, cioè che non è testabile: è possibile verificare se una parte di codice funziona correttamente su dati corretti, ma non che non funzioni mai in modo improprio su dati errati. Allo stesso modo, è possibile utilizzare eval()
in modo sicuro, ma è così difficile nella pratica che è scoraggiato.
Tutto questo è detto in tutta la generalità. Nel tuo contesto specifico, eval()
potrebbe essere sicuro. Tuttavia, ci vuole un certo sforzo per avere un contesto sicuro per l'uso di eval()
, che in realtà ha bisogno di eval()
.