ho notato che la jQuery parseJSON fa fondamentalmente una semplice espressione regolare "check":Dovrebbero essere usati i metodi parseJSON/getJSON di jQuery?
parseJSON: function(data) {
if (typeof data !== "string" || !data) {
return null;
}
// Make sure leading/trailing whitespace is removed (IE can't handle it)
data = jQuery.trim(data);
// Make sure the incoming data is actual JSON
// Logic borrowed from http://json.org/json2.js
if (/^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
.replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) {
// Try to use the native JSON parser first
return window.JSON && window.JSON.parse ?
window.JSON.parse(data) :
(new Function("return " + data))();
} else {
jQuery.error("Invalid JSON: " + data);
}
},
Se passa che "controllare" e se si tratta di un browser moderno si utilizza un parser JSON nativa. Altrimenti, presumo che per un browser come IE6 una nuova funzione venga richiamata automaticamente e restituisca l'oggetto.
Domanda n. 1: Poiché questo è solo un semplice test di regex, non è questo incline a una sorta di oscuro exploit caso limite? Non dovremmo davvero usare un parser completo, per i browser che non supportano l'analisi JSON nativa almeno?
Domanda n. 2: Quanto "più sicuro" è (new Function(" return " + data))()
in contrapposizione a eval("(" + text + ")")
?
json2.js utilizzerà la stessa espressione regolare, quindi "eval', se il JSON nativo non è disponibile. –
Notato. Grazie per il chiarimento. – spoulson