Impide la divulgación de la respuesta a través del secuestro de JSON.
En teoría, el contenido de las respuestas HTTP está protegido por la Política del mismo origen: las páginas de un dominio no pueden obtener ninguna información de las páginas del otro dominio (a menos que se permita explícitamente).
Un atacante puede solicitar páginas en otros dominios en su nombre, por ejemplo, usando una etiqueta <script src=...>
o <img>
, pero no puede obtener ninguna información sobre el resultado (encabezados, contenido).
Por lo tanto, si visita la página de un atacante, no podrá leer su correo electrónico de gmail.com.
Excepto que cuando se usa una etiqueta de script para solicitar contenido JSON, el JSON se ejecuta como Javascript en el entorno controlado de un atacante. Si el atacante puede reemplazar el constructor Array u Object o algún otro método utilizado durante la construcción del objeto, cualquier cosa en el JSON pasaría por el código del atacante y se divulgaría.
Tenga en cuenta que esto sucede en el momento en que JSON se ejecuta como Javascript, no en el momento en que se analiza.
Hay múltiples contramedidas:
Asegurarse de que el JSON nunca se ejecute
Al colocar una while(1);
declaración antes de los datos JSON, Google se asegura de que los datos JSON nunca se ejecuten como Javascript.
Solo una página legítima podría obtener todo el contenido, eliminar el contenido while(1);
y analizar el resto como JSON.
Cosas como for(;;);
se han visto en Facebook, por ejemplo, con los mismos resultados.
Asegurarse de que el JSON no sea Javascript válido
Del mismo modo, agregar tokens no válidos antes del JSON, como &&&START&&&
, asegura que nunca se ejecute.
Siempre devuelva JSON con un objeto en el exterior
Esta es una OWASP
forma recomendada de proteger contra el secuestro de JSON y es la menos intrusiva.
Similar a las contramedidas anteriores, se asegura de que el JSON nunca se ejecute como Javascript.
Un objeto JSON válido, cuando no está encerrado por nada, no es válido en Javascript:
eval('{"foo":"bar"}')
// SyntaxError: Unexpected token :
Sin embargo, esto es válido JSON:
JSON.parse('{"foo":"bar"}')
// Object {foo: "bar"}
Por lo tanto, asegúrese de que siempre devuelve un Objeto en el nivel superior de la respuesta, asegúrese de que el JSON no sea Javascript válido, mientras siga siendo JSON válido.
Como señaló @hvd en los comentarios, el objeto vacío {}
es Javascript válido, y saber que el objeto está vacío puede ser una información valiosa.
Comparación de los métodos anteriores.
La forma OWASP es menos intrusiva, ya que no necesita cambios en la biblioteca del cliente y transfiere JSON válidos. Sin embargo, no está claro si los errores pasados o futuros del navegador podrían vencer esto. Como señaló @oriadam, no está claro si los datos podrían filtrarse en un error de análisis mediante un tratamiento de errores o no (por ejemplo, window.onerror).
La forma en que Google requiere la biblioteca del cliente para que sea compatible con la deserialización automática y puede considerarse más segura sobre los errores del navegador.
Ambos métodos requieren cambios en el lado del servidor para evitar que los desarrolladores envíen accidentalmente JSON vulnerables.