2009-06-03 19 views
16

Pregunta rápida. Evaluar en JavaScript no es seguro, ¿verdad? Tengo un objeto JSON como una cadena y tengo que convertirlo en un objeto real para que pueda obtener los datos:Alternativas a JavaScript eval() para analizar JSON

function PopulateSeriesFields(result) 
{ 
    data = eval('(' + result + ')'); 
    var myFakeExample = data.exampleType 
} 

Si se ayuda a que estoy usando el método $ .ajax de jQuery.

Gracias

+0

me hizo una pregunta similar aquí: http://stackoverflow.com/questions/646597/eval-is-evil-so-what-should-i-use-instead – karlipoppins

Respuesta

25

Bueno, seguro o no, cuando está usando jQuery, es mejor utilizar el método de $.getJSON(), no .ajax $():

$.getJSON(url, function(data){ 
    alert(data.exampleType); 
}); 

eval() general se considera seguro para el análisis JSON cuando solo se están comunicando con su propio servidor y especialmente cuando usa una buena biblioteca JSON en el servidor que garantiza que el JSON generado no contenga nada desagradable.

Incluso Douglas Crockford, el autor de JSON, dijo que no debe usar eval() en ningún lugar de su código, excepto para analizar JSON. Consulte la sección correspondiente en su libro JavaScript: The Good Parts

+1

Estaba escribiendo exactamente lo mismo +1 –

+0

y ahora veo esto .. – Damien

+17

"getJSON" es EXACTAMENTE lo mismo que usar $ .ajax con un tipo de datos de 'json' ... – James

5

Unsafe? Eso depende de si puedes confiar en los datos.

Si puede confiar en que la cadena será JSON (y no incluirá, por ejemplo, funciones), entonces es seguro.

Dicho eso: si usa jQuery, ¿por qué lo hace de forma manual? Use la opción dataType para especificar que es JSON y deje que la biblioteca se encargue de usted.

+1

jQuery utiliza eval ... – James

+2

@JP: pero solo si JSON no está disponible. http://dev.jquery.com/browser/trunk/jquery/src/ajax.js#L504 – Gumbo

+0

Tengo el tipo de datos pero sigue apareciendo como una cadena. Espera, intentaré la aplicación/JSON – Damien

3

Usar el eval de JavaScript no es seguro. Porque JSON es solo un subconjunto de JavaScript, pero el eval de JavaScript permite cualquier JavaScript válido.

Use un analizador JSON real como el JSON parser from json.org en su lugar.

3

La alternativa para evaluar el código es analizarlo manualmente. No es tan difícil como suena, pero es bastante más pesado en tiempo de ejecución. You can read about it here.

La parte importante a tener en cuenta es la evaluación de JSON no es intrínsecamente inseguro. Siempre y cuando confíes en la fuente para no arruinar las cosas. Eso incluye asegurarse de que las cosas pasadas al codificador JSON se hayan escapado correctamente (para evitar que las personas realicen 2 pasos en la ejecución del código en las máquinas de los usuarios).

6

Si no puede confiar en la fuente, entonces está en lo correcto ... eval no es seguro. Podría usarse para inyectar código en sus páginas.

Salida este enlace para una alternativa más segura:

JSON in Javascript

La página explica por qué eval no es seguro y proporciona un enlace a un analizador JSON en la parte inferior de la página.

19

Debe usar JSON y escribir JSON.parse.

El análisis "Manual" es demasiado lento, por lo que la implementación JSON.parse de la biblioteca comprueba cosas y luego termina utilizando eval, por lo que es still unsafe. Pero, si está utilizando un navegador más nuevo (IE8 o Firefox), el código de la biblioteca no se ejecuta realmente.En su lugar, compatible con el navegador nativo entra en acción, y entonces está seguro.

Más información here y here.

+0

http://code.google.com/p/json-sans-eval/ es un analizador manual que pretende ser rápido y seguro. Sin embargo, tiene razón en que debería preferirse el soporte nativo donde esté disponible. –

2

se puede probar como esta

var object = new Function("return " + jsonString)() 
+1

Esto es simplemente un alias eval. –

+2

(gracioso, lo leí como 'mal alias' en el primer escaneo :-) –

+0

Semánticamente, no hay diferencia. –

Cuestiones relacionadas