Mi Spider Sense me advierte que usar eval()
para analizar JSON entrante es una mala idea. Me pregunto si JSON.parse()
, que supongo que es parte de JavaScript y no una función específica del navegador, es más seguro.
Mi Spider Sense me advierte que usar eval()
para analizar JSON entrante es una mala idea. Me pregunto si JSON.parse()
, que supongo que es parte de JavaScript y no una función específica del navegador, es más seguro.
Respuestas:
Eres más vulnerable a los ataques si usas eval
: JSON es un subconjunto de Javascript y json.parse solo analiza JSON, mientras eval
que dejaría la puerta abierta a todas las expresiones JS.
eval('alert(1)');
.
Todas las JSON.parse
implementaciones probablemente usaneval()
JSON.parse
se basa en la solución de Douglas Crockford , que se utiliza eval()
allí mismo en la línea 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 + ')');
La ventaja de JSON.parse
es que verifica que el argumento tenga la sintaxis JSON correcta.
JSON.parse()
en Firefox 28 y Chromium 33 en mi sistema Linux Mint. Fue 2 veces más rápido que eval()
en Firefox y 4 veces más rápido en Chromium. No estoy seguro de qué código fuente está publicando, pero no son lo mismo en mis navegadores.
JSON.parse()
implementación nativa que es más segura y rápida que los eval()
analizadores basados en.
No todos los navegadores son compatibles con JSON nativo, por lo que habrá ocasiones en las que necesitará utilizar eval()
la cadena JSON. Utilice el analizador JSON de http://json.org, ya que se encarga de todo mucho más fácilmente para usted.
Eval()
es un mal pero contra algunos navegadores es un mal necesario pero donde puedas evitarlo, hazlo !!!!!
Hay una diferencia entre lo que aceptarán JSON.parse () y eval (). Prueba eval en esto:
var x = "{\" shoppingCartName \ ": \" shopping_cart: 2000 \ "}"
eval(x) //won't work
JSON.parse(x) //does work
Vea este ejemplo .
Si analiza el JSON con eval
, está permitiendo que la cadena que se analiza contenga absolutamente cualquier cosa, por lo que en lugar de ser solo un conjunto de datos, podría encontrarse ejecutando llamadas a funciones, o lo que sea.
Además, JSON parse
acepta un parámetro adicional, reviver, que le permite especificar cómo manejar ciertos valores, como las fechas y horas (más información y ejemplo en la documentación en línea aquí )
JSON es solo un subconjunto de JavaScript. Pero eval
evalúa el lenguaje JavaScript completo y no solo el subconjunto que es JSON.
JSON.parse
(implementado directamente en el motor de JavaScript) analiza solo JSON. Pero otras implementaciones que no son nativas usan verificaciones de cordura y luego usan eval
por razones de rendimiento.
JSON.parse
es más rápido queeval
, al menos en V8 (motor JS de Chromium). Fuente .