2011-07-20 7 views
10

consigo que JSON.parse() evita que un atacante inyectar JavaScript en la respuesta desde un analizador JSON es sólo un programa de análisis de texto, no un programa de análisis de la escritura por lo que no cierre esta es una DUP de todas las otras preguntas que hablan sobre eso. Esta es una pregunta diferente.¿JSON.parse() es realmente más seguro que eval() cuando la página web y la llamada ajax provienen del mismo servidor?

Si un atacante puede secuestrar su llamada Ajax y poner javascript en la llamada Ajax, ¿no es probable que puedan secuestrar su página web real y poner javascript arbitrario en su página desde la que puedan realizar exactamente el mismo ataque? ?

Claro, no tiene nada que perder al usar JSON.parse() en lugar de eval() (a menos que aún no tenga un analizador JSON en su entorno y tenga que agregar más código para obtener uno), pero situaciones ¿realmente agrega seguridad si su página web está siendo servida por el mismo host que su llamada ajax?

+3

Me pregunto si esto pertenece al [IT Security StackExchange] (http://security.stackexchange.com)? –

+3

Lo puse aquí porque aquí es donde todos los que publican un fragmento de código que usa eval() son criticados acerca de cuán inseguro es. – jfriend00

Respuesta

9

Sí, es realmente más seguro. Cada precaución que no tome es un conjunto de exploits potenciales que no evita.

Un atacante podría tener cierto control sobre la salida de su servidor sin poder cambiarlo por completo. Nadie está sugiriendo que sea una bala mágica, pero es potencialmente más rápido y no estás creando una vulnerabilidad potencial que podría volver y lastimarte.

Tal vez alguien que ejecuta el servidor está teniendo un mal día, y hace algo tonto como la construcción de JSON mediante la concatenación de la entrada del usuario unsanitized:

<?php 
    print '{"foo": ' . $_GET['bar'] . '}'; 
?> 

Si está utilizando JSON.parse, lo peor que pueden hacer es meter una objeto grande en tu memoria. Si usas eval, pueden secuestrar todo.

+0

+1 por proporcionar un ejemplo de cómo 'JSON.parse' es de hecho más seguro dadas las especificaciones originales de OP. –

+0

OK, el único ejemplo que tenemos hasta ahora es que un administrador tonto arruina la respuesta de tu Ajax de una manera que es de alguna manera válida Javascript y peligrosa. – jfriend00

+0

¿Por qué es JSON.parse() más rápido que eval()? ¿Estás diciendo que analizar el JSON en Javascript es más rápido que el motor de interpretación detrás de eval()? – jfriend00

2

Bueno, si son capaces de inyectar en sus respuestas AJAX que probablemente ya con éxito que el hombre-en-el-middle'd de una manera u otra (ARP, DNS o algo más).

Ver http://en.wikipedia.org/wiki/Man-in-the-middle_attack para más detalles sobre este tipo de ataque.

Tiene usted razón en que, si se puede inyectar en su respuesta AJAX, pueden inyectarse páginas enteras también. En realidad, cualquier cosa que reciba O envíe a través de una red ahora es vulnerable en un MitM a menos que se esté utilizando algo como HTTPS \ SSL.

1

Ese es un muy buen punto. Lo único que se me ocurre es que JSON.parse tendría la oportunidad de ser más rápido que eval.

Una ventaja mucho menos probable es si el navegador ya tiene el HTML/JavaScript en caché y el servidor usa Cache-Control para decir que no necesita volver a cargar. Si eso sucede, por supuesto, una persona que intercepta no tendría la oportunidad de modificar la página. Pero ese es un conjunto de circunstancias muy raro. Lo más probable es que requiera que el navegador busque una versión más nueva de HTML/JavaScript, que es el comportamiento predeterminado.

En cuanto a la diferencia de seguridad, creo que estás en lo correcto.

En cuanto a mí, yo trabajo con HTTPS confirmada sólo sistemas. Pero tengo una función que usa JSON.parse si está disponible y vuelve a eval solo para la mejora de la velocidad.

0

Bien ...No defiendo el uso de eval, pero no creo que constituya un problema de seguridad en Javascript, porque Javascript es el idioma del lado del cliente. Si no usa eval en su código, ¿qué impide que ejecute javascript:my_own_evil_code() en la consola o en la barra de direcciones? Es Javascript, puedo ejecutar mi propio código o modificar el suyo, crear mis propias solicitudes HTTP y hacer cualquier cosa con respuestas HTTP, o incluso agregar mi propio eval a sus funciones.

Usted no debe usar eval si hay otra solución comparable, pero si, sólo por simplicidad, quiere hacer eval('('+jsonstring+')') emular JSON.parse, no creo que es un gran error.

+2

Esto no se trata de que el usuario ejecute el código en su propia página. Se trata de un atacante externo que inyecta código en su página. Entonces ... el ejemplo de la barra de direcciones no es de lo que se trata esto. Hay todo tipo de herramientas (como GreaseMonkey) cuyo único propósito es ayudarte a ejecutar código adicional en tus propias páginas. El usuario puede hacer eso. – jfriend00

+2

@ jfriend00 Por favor, sé más específico. Si un atacante puede inyectar algún código, ya es un gran agujero de seguridad, sin importar si hay 'eval' en la fuente o no. Por ejemplo, si un atacante puede modificar la respuesta de la solicitud HTTP creada por 'XMLHttpRequest', también puede modificar el archivo principal (w/Javascript) y así ejecutar su propio código. Estoy casi seguro de que si me muestra cualquier caso de usar 'eval' para ejecutar el código del atacante, también le mostraré cómo hacerlo sin' eval'. – duri

+0

Ese es mi punto también. Dado que la mayoría de los ataques que podrían modificar una respuesta ajax podrían haber modificado la página de host en primer lugar (inyectando directamente su propia JS), proteger la respuesta de ajax no es muy costoso. Poner un doble candado en una puerta cuando todas las demás puertas solo tienen cerraduras individuales no le ofrece mucha protección adicional, especialmente cuando las ventanas no son muy seguras. – jfriend00

Cuestiones relacionadas