2009-06-03 15 views
16

Domanda veloce. Eval in JavaScript non è sicuro vero? Ho un oggetto JSON come una stringa e ho bisogno di trasformarlo in un oggetto reale in modo da poter ottenere i dati:Alternative a JavaScript eval() per analizzare JSON

function PopulateSeriesFields(result) 
{ 
    data = eval('(' + result + ')'); 
    var myFakeExample = data.exampleType 
} 

Se aiuta Sto usando il metodo $ .ajax da jQuery.

Grazie

+0

ho fatto una domanda simile qui: http://stackoverflow.com/questions/646597/eval-is-evil-so-what-should-i-use-instead – karlipoppins

risposta

25

Beh, sicuro o meno, quando si utilizza jQuery, si sta meglio a utilizzare il metodo $.getJSON(), non $ .ajax():

$.getJSON(url, function(data){ 
    alert(data.exampleType); 
}); 

eval() è di solito considerato sicuro per JSON analisi quando si stanno solo comunicando con il tuo server e specialmente quando usi una buona libreria JSON sul lato server che garantisce che il JSON generato non contenga nulla di cattivo.

Anche Douglas Crockford, l'autore di JSON, ha affermato che non è necessario utilizzare eval() in qualsiasi punto del codice, tranne per l'analisi di JSON. Vedere la sezione corrispondente nel suo libro JavaScript: The Good Parts

+1

Stavo scrivendo esattamente la stessa cosa +1 –

+0

e ora vedo questo .. – Damien

+17

"getJSON" è ESATTAMENTE uguale a $ .ajax con un tipo di dati "json" ... – James

5

Non sicuro? Dipende se puoi fidarti dei dati.

Se si può avere fiducia che la stringa sarà JSON (e non includerà, ad esempio, le funzioni), allora è sicura.

Detto questo, se si utilizza jQuery, perché lo stai facendo manualmente? Utilizzare l'opzione dataType per specificare che è JSON e lasciare che la libreria si prenda cura di esso per voi.

+1

jQuery usa eval ... – James

+2

@ JP: ma solo se JSON non è disponibile. http://dev.jquery.com/browser/trunk/jquery/src/ajax.js#L504 – Gumbo

+0

Ho la cosa dataType ma viene ancora restituita come una stringa. Aspetta, proverò l'applicazione/JSON – Damien

3

L'utilizzo di JavaScript eval non è sicuro. Perché JSON è solo un sottoinsieme di JavaScript ma JavaScript eval consente qualsiasi JavaScript valido.

Utilizzare un parser JSON reale come lo JSON parser from json.org.

3

L'alternativa alla valutazione del codice è di analizzarla manualmente. Non è così difficile come sembra, ma è molto più pesante in fase di esecuzione. You can read about it here.

La parte importante da notare è la valutazione di JSON non è intrinsecamente insicuro. Finché ti fidi della fonte di non fare le palle. Ciò include il fatto di assicurarsi che le cose passate nel codificatore JSON siano debitamente escapate (per impedire alle persone 2 di salire sullo stream che esegue il codice sulle macchine degli utenti).

6

Se non ci si può fidare della fonte, allora si è corretti ... la valutazione non è sicura. Potrebbe essere usato per iniettare il codice nelle tue pagine.

controlla questo link per un'alternativa più sicura:

JSON in Javascript

La pagina spiega perché eval è sicuro e fornisce un collegamento ad un parser JSON in fondo alla pagina.

19

È necessario utilizzare JSON e scrivere JSON.parse.

L'analisi "manuale" è troppo lenta, quindi l'implementazione JSON.parse dalla libreria controlla le cose e quindi finisce usando eval, quindi è still unsafe. Tuttavia, se si utilizza un browser più recente (IE8 o Firefox), il codice della libreria non viene effettivamente eseguito.Invece, il supporto del browser nativo viene avviato e quindi si è sicuri.

Ulteriori informazioni here e here.

+0

http://code.google.com/p/json-sans-eval/ è un parser manuale che mira ad essere veloce e sicuro. Hai ragione, tuttavia, che il supporto nativo dovrebbe essere preferito, laddove disponibile. –

2

si può provare in questo modo

var object = new Function("return " + jsonString)() 
+1

Questo è semplicemente un eval alias. –

+2

(divertente, ho letto questo come "alias cattivo" alla prima scansione :-) –

+0

Semanticamente, non c'è differenza. –