2009-02-18 17 views
7

JSON le permite retrieve data in multiple formats desde una llamada AJAX. Por ejemplo:¿Es seguro obtener datos JSON con jQuery?

$.get(sourceUrl, data, callBack, 'json'); 

podrían utilizarse para obtener y analizar código JSON de sourceUrl.

JSON es el código JavaScript simple utilizado para describir los datos. Esto podría ser evadido por un intérprete de JavaScript para recuperar una estructura de datos.

En general, es una mala idea evaluar el código de fuentes remotas. Sé que la especificación JSON no permite específicamente declaraciones de funciones, pero no hay razón por la que no puedas incluir una en el código y que un consumidor inseguro e ingenuo compile/ejecute el código.

¿Cómo maneja jQuery el análisis sintáctico? ¿Evalúa este código? ¿Qué medidas de seguridad existen para evitar que alguien piratee el código sourceUrl y distribuya código malicioso?

Respuesta

7

La última vez que miré (finales de 2008) las funciones de JQuery get() getJSON() etc. evalúan internamente la cadena JSon y están expuestas al mismo problema de seguridad que eval.

Por lo tanto, es una muy buena idea utilizar una función de análisis que valide la cadena JSON para asegurarse de que no contenga ningún código JSON no Jodido, antes de usar eval() en cualquier forma.

Puede encontrar esta función en https://github.com/douglascrockford/JSON-js/blob/master/json2.js.

Consulte JSON and Broswer Security para una buena discusión de esta área.

En resumen, usar las funciones JSON de JQuery sin analizar la entrada JSON (utilizando la función vinculada anterior o similar) no es 100% seguro.

Nota: Si este tipo de análisis todavía no se encuentra en getJSON (que podría haber sido añadido recientemente) es aún más importante entender este riesgo debido a la capacidad de dominios cruzados, a partir de los documentos de referencia JQuery:

A partir de jQuery 1.2, puede cargar los datos de JSON ubicados en otro dominio si especifica una devolución de llamada JSONP, que puede ser hecho así: "myurl? Callback =?". jQuery reemplaza automáticamente el? con el nombre del método correcto para llamar, llamando a su devolución de llamada especificada.

+0

Creo que oyu debería usar http://www.json.org/json2.js para esto ahora - no estoy seguro de las actualizaciones exactas que se han producido en json2, pero sé que evitará anular accidentalmente implementaciones de navegador nativas de la API de JSON (¿tal vez el original no impidió esto?) – olliej

+0

Gracias por la sugerencia, he actualizado el enlace. – Ash

+0

No entiendo por qué es "aún más importante cuando se utiliza jQuery.getJSON()". Ambas formas están ejecutando el código de JavaScript, y ambas formas deben ser desinfectadas. Cuando se utiliza getJSON() con una devolución de llamada, generalmente proviene de otro dominio, por lo tanto, no tiene control sobre la desinfección del JSON. –

0

Todos los navegadores que conozco deshabilitan las solicitudes entre sitios a través de Ajax. Es decir, si su página se encuentra en my.example.com, no puede cargar nada con Ajax, a menos que su URL también se encuentre en mi.example.com.

Esto realmente puede ser una molestia, y hay formas de que un atacante inyecte la fuente de otras maneras, pero aparentemente esta restricción se aplica para abordar exactamente la preocupación que menciona.

2

$.getJSON() se utiliza para ejecutar (en lugar de utilizar eval) el código javascript de fuentes remotas (utilizando el modificador JSONP si se especifica una devolución de llamada). Al utilizar este método, depende totalmente de usted confiar en la fuente, ya que tendrán el control de toda la página (incluso pueden enviar cookies).

De Douglas Crockford página web sobre El script Tag Hack (jsonp):

Así que el guión puede acceder y utilizar sus cookies. Puede acceder al servidor de origen utilizando la autorización del usuario. Puede inspeccionar el DOM y el objeto global JavaScript, y enviar cualquier información que encuentre en cualquier lugar en el mundo. El Script Tag Hack es no es seguro y debe evitarse.

1

Tanto IE 8 y Firefox 3.1 tendrá el apoyo JSON nativo, que proporcionará una alternativa segura a eval(). Esperaría que otros navegadores hicieran lo mismo. También esperaría que jQuery cambie su implementación para usar estos métodos nativos.

Cuestiones relacionadas