Domanda

Una richiesta Ajax mi restituisce un array JSON standard pieno di input del mio utente. L'input è stato disinfettato e, usando la funzione eval (), posso facilmente creare il mio oggetto javascript e aggiornare la mia pagina ...

Quindi ecco il problema. Non importa quanto provo a disinfettare gli input, preferirei non usare la funzione eval (). Ho controllato su Google i modi per utilizzare " JSON in AJAX senza valutazione " e sono passati attraverso diversi metodi ...

Quale dovrei usare? Esiste un modo standard e sicuro per farlo?

È stato utile?

Soluzione

json.org ha una bella libreria javascript

utilizzo semplice:

JSON.parse('[{"some":"json"}]');
JSON.stringify([{some:'json'}]);

Modifica : come sottolineato nei commenti, questo usa eval se guardi attraverso la sua fonte (anche se prima sembra essere disinfettato)

per evitarlo completamente, guarda json_parse o json-sans-eval

json2.js non è sicuro, json_parse.js è lento, json-sans-eval.js non è validante

Altri suggerimenti

  

Esiste un modo standard e sicuro per farlo?

Esiste un modo standard proposto per farlo, nella prossima versione ECMAScript 3.1 di JavaScript: JSON.parse .

Sarà supportato in IE8, Firefox 3.1 / 3.5 e molto probabilmente gli altri browser più diffusi in futuro. Nel frattempo, puoi tornare a, o utilizzare esclusivamente, eval (). Il male può o non può essere; sicuramente sarà più lento di JSON.parse. Ma questo è il solito modo di analizzare JSON oggi.

Se un utente malintenzionato è in grado di inserire JavaScript maligno nei contenuti che stai sputando via JSON, hai problemi più grandi di cui preoccuparti di eval-is-evil.

Direi che, una volta sanificato l'input, eval è il modo migliore di procedere. Se il tuo server viene compromesso, le persone saranno comunque in grado di inviare al client qualunque script desiderino. Quindi mettere una valutazione non è un grosso rischio per la sicurezza. Se sei preoccupato per le persone che manipolano i pacchetti prima che raggiungano il client, di nuovo, gli script stessi possono essere modificati.

Non preoccuparti di eval. Assicurati di avvolgerlo in un blocco try ... catch in modo che i tuoi utenti non ricevano errori JS se il tuo JSON viene alterato.

:)

Per convertire in modo sicuro JSON in un oggetto JS è necessario utilizzare un parser JSON come la funzione JSON.parse () fornita da questa libreria .

Confronta con il modello di progettazione dei comandi: http://en.wikipedia.org/wiki/Command_pattern . Detto questo, puoi definire con precisione le operazioni che un client può eseguire e la tua applicazione sarà sicura come l'interpretazione sottostante.

Dipende da ciò che stai cercando di realizzare con il risanamento. Ho avuto un grande successo con il prototipo supporto del framework per JSON e valutazione sicura.

Se sei sicuro che non ci sia rischio di iniezione e non stai eval () ing in un ciclo, quindi usa eval () . Si confronterà favorevolmente con altre opzioni che saranno certamente più lente, potrebbero rompersi e richiedere al client di scaricare codice aggiuntivo.

" rubati " da jQuery

// Try to use the native JSON parser first
return window.JSON && window.JSON.parse ?
    window.JSON.parse( data ) :
    (new Function("return " + data))();

Problema: Il problema che pone l'Eval è che viene eseguito nell'ambito globale

eval.call(document, "console.log(this)")
eval.call(navigator, "console.log(this)")
eval.call(window, "console.log(this)")
(function(){eval.call(document, "console.log(this)")})()
>Window

Scenario:

Supponi di utilizzare singoli attributi nel codice di markup di vari elementi del documento come un attributo non visibile

<img src="" onvisible="src='http://www.example.com/myimg.png';">

Vorresti ottenere tutti gli elementi con questo attributo, trasformare la stringa onvisible-content in una chiusura e metterla in una coda EventHandler. È qui che entra in gioco il costruttore della funzione JS.

Function === 0..constructor.constructor
>true

Function('return [this, arguments]').call(window, 1,2,3)
>Window, Arguments[3]]
Function('return [this, arguments]').call(document, 1,2,3)
>Document, Arguments[3]]
Function('return [this, arguments]').call(navigator, 1,2,3)
>Navigator, Arguments[3]]    

Mettendo tutto insieme:

var eventQueue = [];
var els = document.querySelectorAll('[onvisible]');

for (var el in els) {
    var jscode = els[el].getAttribute('onvisible');
    eventQueue.push( {el:els[el], cb:Function(jscode)} )
}

//eventQueue[0].cb.call(scope, args);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top