2010-03-15 11 views

risposta

31

La citazione nella risposta di Nick suggerisce. Non è davvero una grande differenza, ma la sensazione è che eval è "peggio" di new Function. Non in termini di sicurezza - sono entrambi ugualmente inutili di fronte a input non attendibili, ma speriamo che la tua webapp non restituisca stringhe JSON non attendibili - ma in termini di stranezze a livello di linguaggio e quindi di resistenza all'ottimizzazione.

In particolare:

function victim() { 
    var a= 1; 
    eval('a= 2'); 
    return a; 
} 

2.La stringa eval ha operato sull'ambito della variabile locale victim! Questo è qualcosa che una normale funzione scritta dall'utente non potrebbe mai fare; eval può farlo solo perché è magia oscura.

Utilizzando una funzione regolare invece rimuove questo elemento di magia:

function victim() { 
    var a= 1; 
    (new Function('a= 2;'))(); 
    return a; 
} 

in quanto sopra, la restituito a rimane 1; la nuova funzione può operare solo sulle proprie variabili locali o sul globale window.a.

Questa conoscenza consente agli strumenti di analisi del codice, che potrebbero includere motori JavaScript e minifratori particolarmente intelligenti, di applicare ulteriori ottimizzazioni. Ad esempio la seconda funzione victim potrebbe avere la variabile a completamente ottimizzata su return 1. Un utilizzo di eval e molte ottimizzazioni potenziali non saranno fattibili.

Naturalmente, in pratica, per una funzione molto piccolo come un JSON eval ehm, non ci sta per essere una notevole differenza, ma in generale il pensiero è:

  • evitare di entrambi gli approcci per quanto possibile (si sono entrambi non consentiti nella modalità Strict della Quinta Edizione di ECMAScript);
  • se è necessario utilizzarne uno, new Function è preferibile a eval, a meno che non si abbia realmente bisogno del codice per accedere alle variabili locali della funzione di chiamata.
3

http://www.json.org/js.html

La funzione eval è molto veloce. Tuttavia, è possibile compilare ed eseguire qualsiasi programma JavaScript, pertanto è possibile che si verifichino problemi di sicurezza. L'utilizzo di eval viene indicato quando la fonte è affidabile e competente. È molto più sicuro utilizzare un parser JSON. Nelle applicazioni Web su XMLHttpRequest, la comunicazione è consentita solo alla stessa origine che fornisce quella pagina, quindi è attendibile. Ma potrebbe essere non essere competente. Se il server non è rigoroso nella sua codifica JSON, o se non convalida scrupolosamente tutti i suoi input, allora può consegnare un testo JSON non valido che potrebbe trasportare script pericoloso. La funzione eval farebbe eseguire lo script, scatenando la sua malizia.

Cosa intendete esattamente con sicuro? codice Almeno dannoso non viene eseguito;)

Consulta anche: Alternatives to JavaScript eval() for parsing JSON

Un altro punto potrebbe essere, che new Function() è considerato un little faster di eval.

Aggiornamento:

si può sostanzialmente leggere gli stessi argomenti del comments on jQuery's .parseJSON() function.

+0

Suona come una buona risposta per una domanda dispari =) –

+5

ma con 'nuova funzione();' codice malevolo è ancora eseguito. –

+4

Come si presenta una buona risposta? Luca voleva sapere come 'eval' è diverso da' new Function (...) ', e questo dice solo cosa c'è di sbagliato in' eval'. – Gabe

11

Quanto al motivo per jQuery utilizza specificamente new Function(), John Resig answered this on the jQuery forums

Utilizzare eval provoca problemi di ogni genere per minifiers codice dal momento che non è chiaro quello che potrebbe essere in esecuzione nella eval. Guardando gli ultimi risultati di quella corsa sembra che la nuova funzione sia equamente equivalente a eval e anche a volte leggermente più veloce. L'unica eccezione era Safari 4 - ma questi risultati sono datati, Safari 4 è stato distribuito con un'implementazione nativa di JSON.parse, che usiamo.

Problemi correlati