me di cuenta de que el jQuery parseJSON básicamente hace una expresión regular simple "marca":¿Se deberían usar los métodos parseJSON/getJSON de 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);
}
},
Si pasa que "verificar" y si se trata de un navegador moderno se utiliza un analizador JSON nativo. De lo contrario, supongo que para un navegador como IE6 se invoca automáticamente una nueva función y devuelve el objeto.
Pregunta n. ° 1: Dado que se trata de una simple prueba de expresión regular, ¿no es esto propenso a algún tipo de oscuro exploit de caso extremo? ¿No deberíamos estar usando un analizador completo, para los navegadores que no son compatibles con el análisis nativo de JSON al menos?
Pregunta # 2: ¿Cuánto "más seguro" es (new Function(" return " + data))()
en comparación con eval("(" + text + ")")
?
json2.js usará la misma expresión regular, y luego 'eval', si el JSON nativo no está disponible. –
observado. Gracias por aclararlo. – spoulson