2009-10-24 17 views
9

Recientemente comencé a buscar la creación de aplicaciones web usando .NET MVC y tropecé con esta publicación de blog de Phil Haack: JSON Hijacking. Para aquellos de ustedes que no conocen esta vulnerabilidad cuando usan JSON para transferir datos confidenciales, es realmente una lectura obligada.¿Prefiere envolver matrices JSON en otro objeto JSON o siempre requiere POST para evitar el secuestro JSON?

Parece que hay tres formas de manejar esta vulnerabilidad.

  1. Requiere un POST en lugar de GET en su servicio JSON.
  2. Envuelva las respuestas de su matriz JSON en un objeto JSON.
  3. No exponga los datos sensibles de cualquier servicio que no está protegido por 1 o 2.

La tercera alternativa no es realmente una opción, ya que realmente limita el uso de JSON.

Entonces, ¿cuál de los otros dos prefiere?

La vista previa de .NET MVC 2 requiere un POST para las respuestas JSON de forma predeterminada, creo que esta es una excelente manera de proteger a cualquier desarrollador que aún no conozca este problema. Pero para mí se siente un poco "hacky" para romper REST de esta manera. A menos que alguien me convenza de ello, me estoy quedando envolver mis matrices en otro objeto y desenvolverlo en el lado del cliente.

Respuesta

7

personalmente envolver todas mis respuestas en un comentario:

/* { 
    "foo": 3, 
    "bar": "string with *\x2F sequence in" 
} */ 

y tiras que antes JSON.parsing. Esto lo hace inútil como objetivo para las etiquetas de script.

Vale la pena señalar que este problema no solo tiene que ver con JSON, sino con cualquier respuesta HTTP que sirva y que pueda interpretarse como JavaScript. Incluso, por ejemplo, un archivo de texto .htaccess-protected es vulnerable a la filtración a través de la inclusión de etiquetas de script de terceros, si está en un formato que resulta ser JavaScript válido.

Y aquí está la contracción: gracias a E4X, incluso los documentos XML estáticos son también válidos JavaScript. E4X es una extensión desastrosa e inútil para JavaScript, implementada e inventada en Mozilla, que le permite escribir <element>content</element> literales XML en línea en JS; como tal, un archivo XML protegido ahora es vulnerable a los mismos riesgos de fuga entre sitios que JSON. Gracias Mozilla. Ver el artículo de Google doctype sobre esto.

+0

el artículo e4x mencionas habla de los riesgos de seguridad en la dirección opuesta: que los consumidores * * de datos E4X deben tener cuidado de no ejecutarlo w/o análisis. Si * produces * datos e4x, ¿cuál es la preocupación? –

+0

La página trata la inyección en ambas direcciones. Anteriormente (y aún en Firefoxen anterior) se podía alterar el prototipo XML para acceder a los objetos E4X creados recientemente por script externo, y aún existen peligros potenciales para el contenido de JavaScript anidado en E4X para invocar devoluciones de llamada de atacante.Este es especialmente el caso para las páginas que incluyen contenido proporcionado por el atacante, incluso escapado adecuadamente. – bobince

0

Dado que esto es básicamente un ataque CSRF, puede poner un token (por ejemplo, hash de identificación de sesión y secreto) en cada una de sus llamadas JSON y verificar la validez de ese token en el servidor. Es lo mismo que debe hacer para las solicitudes POST regulares de todos modos.

+0

Esto solo evita publicar datos suplantando a otra persona. No detiene al malo de robar información sensible que es servida por un servicio GET JSON. –

+0

El chico malo necesita saber el token, pero no creo que haya una manera de obtenerlo. Por favor, demuéstrame que estoy mal – stefanw

+0

@stefanw el artículo vinculado en la pregunta menciona que los datos pueden almacenarse en caché, por lo tanto, revisar los encabezados no ayuda. Creo que lo mismo se aplica a la comprobación de un token CSRF. – Flash