Obtengo que JSON.parse () evita que un atacante inyecte javascript en la respuesta, ya que un analizador JSON es solo un analizador de texto, no un analizador de scripts, así que no cierres esto es un duplicado de todas las otras preguntas que hablan sobre eso . Esta es una pregunta diferente.

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

Claro, no tiene nada que perder usando JSON.parse () en lugar de eval () (a menos que todavía no tenga un analizador JSON en su entorno y tenga que agregar más código para obtener uno), pero qué situaciones realmente lo hace agrega seguridad si su página web está siendo atendida por el mismo host que su llamada ajax?

14
jfriend00 20 jul. 2011 a las 20:16

4 respuestas

La mejor respuesta

Sí, es realmente más seguro. Cada precaución que no tomes es un conjunto de posibles vulnerabilidades que no evitas.

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

Tal vez alguien que está ejecutando su servidor está teniendo un mal día y hace algo tonto como construir JSON concatenando la entrada de usuario no higiénica:

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

Si está utilizando JSON.parse, lo peor que pueden hacer es guardar un objeto grande en su memoria. Si está utilizando eval pueden secuestrar todo.

12
Jeremy Banks 21 jul. 2011 a las 02:50

Bueno ... no estoy abogando por el uso de eval, pero no creo que constituya un problema de seguridad en Javascript , porque Javascript es un lenguaje del lado del cliente. Si no usa eval en su código, ¿qué me impide ejecutar javascript:my_own_evil_code() en la consola o 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.

No debe usar eval si hay otra solución comparable disponible, pero si, por simplicidad, quiere hacer eval('('+jsonstring+')') para emular JSON.parse, no creo que sea un gran error.

-1
duri 20 jul. 2011 a las 16:45

Ese es un muy buen punto. Lo único en lo que puedo pensar 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 recargarse. Si eso sucede, por supuesto, una persona que intercepte no tendrá la oportunidad de modificar la página. Pero ese es un conjunto muy raro de circunstancias. Lo más probable es que va a requerir que el navegador verifique una versión más nueva de HTML / JavaScript, que es el comportamiento predeterminado.

En cuanto a la diferencia de seguridad, creo que tienes razón.

En cuanto a mí, trabajo solo con sistemas confirmados HTTPS. Pero tengo una función que usa JSON.parse si está disponible y recurre a eval solo para mejorar la velocidad.

1
Bryan Field 20 jul. 2011 a las 16:21

Bueno, si pueden inyectar en sus respuestas AJAX, probablemente ya lo hayan manipulado con éxito de una forma u otra (ARP, DNS u otra cosa).

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

Tienes razón en eso, si pueden inyectar en tu respuesta AJAX, también pueden inyectar páginas enteras. Realmente, cualquier cosa que reciba o envíe a través de la red ahora es vulnerable en un MitM a menos que se esté utilizando algo como HTTPS \ SSL.

2
mikeycgto 20 jul. 2011 a las 16:21