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 eval
lascerebbe la porta aperta a tutte le espressioni JS.
eval('alert(1)');
.
È JSON.parse
molto probabile che tutte le implementazioni utilizzinoeval()
JSON.parse
si 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 parse
accetta 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 eval
valuta 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 eval
per motivi di prestazioni.
JSON.parse
è più veloceeval
, almeno nel V8 (motore JS di Chromium). Fonte .