Il mio Spider Sense mi avverte che utilizzare eval()per analizzare il JSON in arrivo è una cattiva idea. Mi chiedo solo se JSON.parse()- che presumo faccia parte di JavaScript e non una funzione specifica del browser - sia più sicuro.
Il mio Spider Sense mi avverte che utilizzare eval()per analizzare il JSON in arrivo è una cattiva idea. Mi chiedo solo se JSON.parse()- che presumo faccia parte di JavaScript e non una funzione specifica del browser - sia più sicuro.
Risposte:
Sei più vulnerabile agli attacchi se usi eval: JSON è un sottoinsieme di Javascript e json.parse analizza solo JSON mentre evallascerebbe la porta aperta a tutte le espressioni JS.
eval('alert(1)');.
È JSON.parsemolto probabile che tutte le implementazioni utilizzinoeval()
JSON.parsesi basa sulla soluzione di Douglas Crockford , che utilizza eval()proprio lì sulla linea 497 .
// In the third stage we use the eval function to compile the text into a
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
// in JavaScript: it can begin a block or an object literal. We wrap the text
// in parens to eliminate the ambiguity.
j = eval('(' + text + ')');
Il vantaggio di JSON.parseè che verifica che l'argomento sia la sintassi JSON corretta.
JSON.parse()in Firefox 28 e Chromium 33 sul mio sistema Linux Mint. Era 2x più veloce eval()di Firefox e 4x più veloce di Chromium. Non sono sicuro del codice sorgente che stai pubblicando, ma non sono la stessa cosa nei miei browser.
JSON.parse()un'implementazione nativa che è più sicura e veloce dei eval()parser basati su.
Non tutti i browser hanno il supporto JSON nativo, quindi ci saranno momenti in cui sarà necessario utilizzare eval() la stringa JSON. Usa il parser JSON da http://json.org in quanto gestisce tutto molto più facilmente per te.
Eval() è un male ma contro alcuni browser è un male necessario ma dove puoi evitarlo fallo !!!!!
C'è una differenza tra ciò che JSON.parse () e eval () accetteranno. Prova eval su questo:
var x = "{\" shoppingCartName \ ": \" shopping_cart: 2000 \ "}"
eval(x) //won't work
JSON.parse(x) //does work
Vedi questo esempio .
Se analizzi il JSON con eval, stai consentendo alla stringa analizzata di contenere assolutamente qualsiasi cosa, quindi invece di essere solo un insieme di dati, potresti ritrovarti a eseguire chiamate di funzione o qualsiasi altra cosa.
Inoltre, JSON parseaccetta un parametro aggiuntivo, reviver, che ti consente di specificare come gestire determinati valori, come i datetimes (maggiori informazioni ed esempio nella documentazione in linea qui )
JSON è solo un sottoinsieme di JavaScript. Ma evalvaluta l'intero linguaggio JavaScript e non solo il sottoinsieme che è JSON.
JSON.parse(implementata direttamente nel motore JavaScript) analizza solo JSON. Ma altre implementazioni non native usano eseguire alcuni controlli di integrità e quindi utilizzare evalper motivi di prestazioni.
JSON.parseè più veloceeval, almeno nel V8 (motore JS di Chromium). Fonte .