Mi sentido arácnido me advierte que el uso de eval()
para analizar JSON entrante es una mala idea. Me pregunto si JSON.parse()
, que supongo que es una parte de JavaScript y no una función específica del navegador, es más seguro.JSON.parse vs eval()
Respuesta
Usted es más vulnerable a ataques si utilizando eval
: JSON es un subconjunto de JavaScript y JSON.parse simplemente analiza JSON mientras que eval
dejaría la puerta abierta a todas las expresiones JS.
JSON es sólo un subconjunto de JavaScript. Pero eval
evalúa el lenguaje de JavaScript completo y no solo el subconjunto que es JSON.
Derecho, lo sé. ¿Está implicando que JSON.parse() SOLO evalúa JSON y falla en todos los demás datos entrantes? ¿O es simplemente un contenedor para: var myObject = eval ('(' + responseText + ')'); ?? –
@Kevin Major: Sí, el 'JSON.parse' originalmente implementado (directamente implementado en el motor de JavaScript) analiza solo JSON. Pero otras implementaciones que no son nativas usan algunas verificaciones de cordura y luego usan 'eval' por razones de rendimiento. – Gumbo
Si analiza el JSON con eval
, está permitiendo que la cadena analizada contenga absolutamente todo, así que en lugar de simplemente ser un conjunto de datos, podría encontrarse ejecutando llamadas a funciones, o lo que sea.
Además, JSON de parse
acepta un parámetro adicional, resucitador, que le permite especificar cómo hacer frente a ciertos valores, como datetimes (más información y ejemplos en la documentación en línea here)
No todos los navegadores tienen soporte JSON nativa por lo que habrá momentos en los que hay que utilizar eval()
a la cadena JSON. Utilice el analizador JSON desde http://json.org ya que maneja todo mucho más fácil para usted.
Eval()
es un mal sino contra algunos navegadores es un mal necesario, pero donde se puede evitar, lo hacen !!!!!
Todos JSON.parse
implementaciones más probable es que utilice eval()
JSON.parse
se basa en Douglas Crockford's solution, que utiliza eval()
allí mismo, en line 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 se verifica el argumento es la sintaxis correcta JSON.
, sí, excepto que la línea justo antes de eso verifica que es una cadena segura y válida. – nickf
Probé '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. – jbo5112
@plodder "ventaja" probablemente no es barato hacer eso verificando. – momomo
hay una diferencia entre lo JSON.parse() y eval() aceptará. Trate de eval en esto:
var x = "{\" shoppingCartName \ ": \" shopping_cart: 2000 \ "}"
eval(x) //won't work
JSON.parse(x) //does work
ver este example.
eval no funciona porque analiza cadenas como instrucciones de código y, por lo tanto, considera "{...}" como una expresión de código en lugar de una expresión de declaración de valor. si elimina la ambigüedad ("[{....}]", por ejemplo), no hay dudas sobre la naturaleza de la expresión y eval creará una matriz que contiene el objeto analizado –
Sí. Tradicionalmente, x estaría envuelto por paréntesis: eval ("(" + x + ")"). Lo que dije sigue en pie: no hay ambigüedad al usar JSON.parse(). –
- 1. jQuery.parseJSON vs JSON.parse
- 2. python eval vs ast.literal_eval vs JSON decode
- 3. Php (eval vs call_user_func vs funciones variables ...)
- 4. ¿JSON.parse() requiere comillas dobles?
- 5. (1, eval) ('this') vs eval ('this') en JavaScript?
- 6. eval-after-load vs. mode hook
- 7. cadena JSON.parse con citas
- 8. ¿JSON.parse() es realmente más seguro que eval() cuando la página web y la llamada ajax provienen del mismo servidor?
- 9. Distinguir eval local desde eval mundial
- 10. JSON.stringify y JSON.parse no funcionan en IE9?
- 11. Ruby JSON.parse devolviendo datos incorrectos para unicode
- 12. JSON.parse para la matriz del objeto
- 13. JSON.parse analiza/convierte números grandes incorrectamente
- 14. JSON.parse() problema con expresión regular valora
- 15. Cómo ejecutar "eval" sin escribir "eval" en JavaScript
- 16. caché eval() resultado
- 17. ¿Por qué eval() existe?
- 18. EVAL en el Esquema
- 19. Python: make eval safe
- 20. Chrome - eval -() la función
- 21. Eval() = símbolo inesperado: Error
- 22. ASP: LinkButton y Eval
- 23. F # equivalente a Eval
- 24. Concatenar texto con Eval
- 25. Ruby on Rails Error de token inesperado JSON.parse
- 26. Forma correcta de detectar la excepción de JSON.parse
- 27. Problemas con la fecha() al usar JSON.stringify() y JSON.parse()
- 28. JSON.parse: carácter no blanco inesperado después de datos JSON
- 29. ¿Por qué no eval() JSON?
- 30. Inesperado $ end en eval() 'código
* "Eres más vulnerable a los ataques" *, ¡estoy totalmente en desacuerdo! – Hydro
Lo siento, Matheus, tengo que estar de acuerdo. El problema es cuando está utilizando eval() para interpretar "entrada de usuario", que es CUALQUIER fuente externa de su JavaScript (incluidos los valores devueltos de servlets u otros servicios web a los que ha llamado).No puede garantizar que los usuarios no hayan ingresado JavaScript malicioso directamente en su aplicación cliente, o indirectamente debido a datos no validados almacenados en la base de datos del servidor y luego transmitidos a su programa a través de una llamada al estilo AJAX. Es posible que aún necesite validar campos individuales para evitar ataques de "diputado confundido", pero usar JSON.parse es un buen primer paso. – JackLThornton
@Hydro Prueba de concepto breve: intente 'eval ('alert (1)');'. –