2011-07-04 18 views
7

He notado que algunas consultas json, particularmente en los servicios de google, devuelven un "json" peculiar que comienza con una secuencia de cierre y luego tiene solo una estructura de matriz, especificada con llaves cuadradas¿Qué tipo de respuesta json comienza con]]} '

¿Qué tipo de ajax es esto? ¿Hay alguna biblioteca, js o py, analizándolo?

Para poner un ejemplo más concreto:

>>> import json 
>>> import urllib2 
>>> url=urllib2.urlopen("https://plus.google.com/u/0/_/socialgraph/lookup/visible/?o=%5Bnull%2Cnull%2C%22114423404493486623226%22%5D") 
>>> url.readline() 
")]}'\n" 
>>> url.readline() 
'\n' 
>>> url.readline() 
'[["tsg.lac",[]\n' 

y desde allí, una matriz típica sigue. La respuesta completa es, por lo tanto, un "encabezado" de dos líneas y luego una matriz, pero el "encabezado" es muy desconcertante y me pregunto si proviene de una biblioteca estándar de ajax o simplemente es una idea de estos tipos.

Ah, si utiliza las herramientas de desarrollador de Chrome para examinar las consultas reales, verá lo mismo. Entonces me inducen a creer que es una respuesta real y no un artefacto de la consulta.

+0

¿Puedes pegar en un ejemplo?)]} ciertamente no son caracteres válidos para comenzar una estructura JSON. – marchaos

+0

¿Puedes enviar un poco de muestra aquí? Primero, creo que una cadena json válida no debería comenzar con algo como)]} ', http://www.json.org/. En segundo lugar, es posible que la aplicación en sí misma pueda desvincular la cadena a una cadena json válida o definir su propia sintaxis. –

+0

ok, lo edito para poner una muestra. – arivero

Respuesta

4

El uso de JSON no válido al comienzo de un mensaje es una forma de vencer una combinación de CSRF y a tricky attack on JavaScript's array constructor. Si esa URL devolvió una matriz válida sin envolver, cualquier sitio que visite podría sobrecargar la función Array, colocar/insertar una referencia de script a esa URL de Google+ en la página y recolectar sus datos privados/seguros cuando simplemente cargó su página.

El código del lado del cliente de Google puede quitar ese JSON no válido antes de analizarlo, porque está utilizando una solicitud XHR tradicional que les da acceso a la respuesta bruta. Un sitio remoto solo puede acceder a él a través de la inyección de elemento de script y no tiene posibilidad de preprocesar los datos antes de que el navegador lo analice. El último es similar a cómo funciona JSONP, y el constructor Array se convierte involuntariamente en la función de devolución de llamada.

Verá un enfoque similar en muchos sitios de alto perfil que devuelven matrices JSON en respuesta a las solicitudes GET. Facebook rellena el suyo con for (;;);, por ejemplo. Si intenta utilizar el ataque CSRF contra esas API de Facebook, el navegador simplemente ingresa un bucle infinito en el sitio remoto haciendo referencia a la API privada de Facebook. En Facebook.com, su código del lado del cliente tiene la oportunidad de quitarlo antes de ejecutar un JSON.parse() en él.

Cuestiones relacionadas