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.
javascript
json
Kevin Major
fuente
fuente
JSON.parse
es más rápido queeval
, al menos en V8 (motor JS de Chromium). Fuente .Respuestas:
Eres más vulnerable a los ataques si usas
eval
: JSON es un subconjunto de Javascript y json.parse solo analiza JSON, mientraseval
que dejaría la puerta abierta a todas las expresiones JS.fuente
eval('alert(1)');
.Todas las
JSON.parse
implementaciones probablemente usaneval()
JSON.parse
se basa en la solución de Douglas Crockford , que se utilizaeval()
allí mismo en la línea 497 .La ventaja de
JSON.parse
es que verifica que el argumento tenga la sintaxis JSON correcta.fuente
JSON.parse()
en Firefox 28 y Chromium 33 en mi sistema Linux Mint. Fue 2 veces más rápido queeval()
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 loseval()
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 !!!!!fuente
Hay una diferencia entre lo que aceptarán JSON.parse () y eval (). Prueba eval en esto:
var x = "{\" shoppingCartName \ ": \" shopping_cart: 2000 \ "}"
Vea este ejemplo .
fuente
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í )fuente
JSON es solo un subconjunto de JavaScript. Pero
eval
evalúa el lenguaje JavaScript completo y no solo el subconjunto que es JSON.fuente
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 usaneval
por razones de rendimiento.