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?
4 respuestas
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.
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.
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.
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.
Preguntas relacionadas
Preguntas vinculadas
Nuevas preguntas
javascript
Para preguntas sobre la programación en ECMAScript (JavaScript / JS) y sus diversos dialectos / implementaciones (excepto ActionScript). Incluya todas las etiquetas relevantes en su pregunta; por ejemplo, [node.js], [jquery], [json], etc.