My Spider Sense mi avverte che usare eval()
per analizzare JSON in arrivo è una cattiva idea. Mi stavo chiedendo se JSON.parse()
- che presumo sia una parte di JavaScript e non una funzione specifica del browser - sia più sicuro.JSON.parse vs. eval()
risposta
Siete più vulnerabili alle attacchi se si utilizza eval
: JSON è un sottoinsieme di Javascript e json.parse analizza JSON mentre eval
lascerebbe la porta aperta a tutte le espressioni JS.
JSON è solo un sottoinsieme di JavaScript. Ma eval
valuta il linguaggio JavaScript completo e non solo il sottoinsieme che è JSON.
Giusto, lo so. Stai insinuando che JSON.parse() SOLO valuta JSON e fallisce su tutti gli altri dati in entrata? O è semplicemente un wrapper per: var myObject = eval ('(' + responseText + ')'); ?? –
@Kevin Major: Sì, il 'JSON.parse 'implementato in modo nativo (implementato direttamente nel motore JavaScript) analizza solo JSON. Ma altre implementazioni non native usano un controllo di integrità e quindi usano 'eval' per motivi di prestazioni. – Gumbo
Se analizzi il JSON con eval
, stai permettendo che la stringa che viene analizzata contenga assolutamente nulla, quindi invece di essere solo un insieme di dati, potresti trovarti ad eseguire chiamate di funzione o altro.
Inoltre, JSON di parse
accetta un parametro adizionale, reviver, che consente di specificare come trattare con certi valori, come ad esempio datetimes (ulteriori informazioni ed esempi nella documentazione in linea here)
Non tutti i browser hanno il supporto JSON nativo, quindi ci saranno momenti in cui è necessario utilizzare eval()
nella stringa JSON. Utilizza il parser JSON da http://json.org in quanto gestisce tutto molto più facile per te.
Eval()
è un male ma contro alcuni browser è un male necessario ma dove puoi evitarlo, fallo !!!!!
Tutti JSON.parse
implementazioni più probabile usare eval()
JSON.parse
si basa su Douglas Crockford's solution, che utilizza eval()
proprio lì sul line 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 l'argomento è corretta sintassi JSON.
sì, tranne per il fatto che la riga subito prima verifica che si tratti di una stringa sicura e valida. – nickf
Ho testato 'JSON.parse()' in Firefox 28 e Chromium 33 sul mio sistema Linux Mint. Era 2x veloce come 'eval()' in Firefox e 4x come veloce in Chromium. Non sono sicuro del codice sorgente che stai pubblicando, ma non sono la stessa cosa nei miei browser. – jbo5112
@plodder "advantage" probabilmente non è economico per fare ciò. – momomo
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
Vai a questa example.
eval non funziona perché analizza le stringhe come istruzioni di codice e quindi considera "{...}" come un'espressione di codice invece di un'espressione di dichiarazione di valore. se rimuovi l'ambiguità ("[{....}]" per esempio), non c'è dubbio sulla natura dell'espressione e eval creerà una matrice contenente l'oggetto analizzato –
Sì. Tradizionalmente, x sarebbe racchiuso tra parentesi: eval ("(" + x + ")"). Ciò che ho detto continua a essere: non c'è ambiguità quando si usa JSON.parse(). –
- 1. jQuery.parseJSON vs JSON.parse
- 2. python eval vs ast.literal_eval vs JSON decode
- 3. Php (eval vs call_user_func vs funzioni variabili ...)
- 4. Utilizzando python's eval() vs. ast.literal_eval()?
- 5. (1, eval) ('this') vs eval ('this') in JavaScript?
- 6. JSON.parse() richiede virgolette doppie?
- 7. aggancio eval-after-load vs. mode
- 8. LocalStorage e JSON.stringify JSON.parse
- 9. Node.JS JSON.parse error undefined
- 10. stringa JSON.parse con citazioni
- 11. Analizzare "rilassato" JSON senza eval
- 12. Differenza tra `eval` e` eval-syntax`
- 13. Distinguere eval locale da eval globale
- 14. JSON.parse per array di oggetti
- 15. JSON.parse() Errore di token imprevisto
- 16. Ruby JSON.parse restituisce una matrice
- 17. Token inatteso: u JSON.parse() issue
- 18. JSON.parse analizza/converte erroneamente i numeri grandi
- 19. JSON.parse che analizza JSON con oggetti nidificati
- 20. JSON.parse() non funziona in javascript in pentaho
- 21. Perché JSON.Parse dice "carattere non valido"?
- 22. JSON.parse non funziona su iPad safari
- 23. JSON.parse sfuggire caratteri di nuova riga
- 24. JSON.parse Uncaught SyntaxError: token imprevisto o
- 25. Ruby JSON.parse restituisce dati errati per unicode
- 26. JSON.parse sta dando un oggetto "non definito"
- 27. JSON.parse: atteso nome della proprietà o '}'
- 28. EVAL in SCHEMA
- 29. Eval: quando viene utilizzato?
- 30. Perché esiste eval()?
* "Sei più vulnerabile agli attacchi" *, non sono assolutamente d'accordo! – Hydro
Scusa, Matheus, devo essere d'accordo. Il problema è quando si utilizza eval() per interpretare "input utente" - che è QUALUNQUE fonte esterna dal proprio JavaScript (compresi i valori restituiti da servlet o altri servizi Web che si sono chiamati).Non è possibile garantire che gli utenti non abbiano inserito il codice JavaScript dannoso direttamente nell'app del client o indirettamente a causa di dati non convalidati memorizzati nel database del server e quindi trasmessi al programma tramite una chiamata in stile AJAX. Potrebbe comunque essere necessario convalidare singoli campi per evitare attacchi "confusi da deputato", ma l'utilizzo di JSON.parse è un buon primo passo. – JackLThornton
@Hydro Breve prova del concetto: prova 'eval ('alert (1)');'. –