De Wikipedia, la enciclopedia libre
Saltar a navegación Saltar a búsqueda

JSONP , o JSON-P (JSON con relleno), es una técnica de JavaScript histórica para solicitar datos cargando un <script>elemento, [1] que es un elemento destinado a cargar JavaScript ordinario. Fue propuesto por Bob Ippolito en 2005. [2] JSONP permite compartir datos sin pasar por la política del mismo origen , lo que no permite ejecutar código JavaScript para leer elementos DOM de medios o datos XMLHttpRequest extraídos de fuera del sitio de origen de la página. El sitio de origen se indica mediante una combinación de esquema de URI, nombre de host y número de puerto .

JSONP es vulnerable a que la fuente de datos reemplace la llamada de función inocua con código malicioso, por lo que ha sido reemplazado por el intercambio de recursos de origen cruzado (disponible desde 2009 [3] ) en aplicaciones modernas.

Funcionalidad [ editar ]

El <script>elemento HTML generalmente puede ejecutar código JavaScript recuperado de orígenes extranjeros. Sin embargo, los servicios que respondían con datos JSON puros no podían compartir datos de orígenes extranjeros antes de la adopción de CORS ( intercambio de recursos de origen cruzado ).

Por ejemplo, una solicitud a un servicio extranjero http://server.example.com/Users/1234puede devolver un registro de una persona llamada Alice en formato JSON. La sintaxis de JSON es coherente con la sintaxis de objetos de JavaScript.

{ "Nombre" :  "Alice" , "Id" :  1234 , "Rango" :  7}

Sin soporte para CORS, un intento de usar los datos en todos los dominios da como resultado un error de JavaScript.

< script  type = "aplicación / javascript" src = "http://server.example.com/Users/1234" ></ script >

El navegador descargará el <script>archivo, evaluará su contenido, malinterpretará los datos JSON sin procesar como un bloque y arrojará un error de sintaxis. Incluso si los datos se interpretaron como un literal de objeto de JavaScript, no se podría acceder a ellos mediante JavaScript ejecutándose en el navegador, ya que sin una asignación de variable, los literales de objeto son inaccesibles.

En el patrón de uso de JSONP, la solicitud de URL a la que apunta el srcatributo en el <script>elemento devuelve datos JSON, con código JavaScript (generalmente una llamada de función) envuelto alrededor. Esta "carga útil envuelta" es luego interpretada por el navegador. De esta forma, una función que ya esté definida en el entorno JavaScript puede manipular los datos JSON. A continuación, se muestra una solicitud y respuesta JSONP típicas.

La llamada de función a parseResponse () es la "P" de JSONP, el "relleno" o "prefijo" alrededor del JSON puro. [4] Para que JSONP funcione, un servidor debe responder con una respuesta que incluya la función JSONP. JSONP no funciona con resultados con formato JSON. La invocación de la función JSONP que se devuelve y la carga útil que recibe la función deben ser acordadas por el cliente y el servidor. Por convención, el servidor que proporciona las ofertas de datos JSON del sitio Web que solicita a nombre de la función JSONP, por lo general mediante el jsonp nombre o la devolución de llamada como el parámetro de cadena de consulta con nombre, en su petición al servidor: <script src="http://server.example.com/Users/1234?callback=parseResponse"></script>.

En este ejemplo, la carga útil recibida sería:

parseResponse ({ "Nombre" :  "Alice" ,  "Id" :  1234 ,  "Rango" :  7 });

Inyección de elementos de script [ editar ]

JSONP solo tiene sentido cuando se usa con un elemento de secuencia de comandos. Para cada nueva solicitud JSONP, el navegador debe agregar un nuevo <script>elemento o reutilizar uno existente. La primera opción, agregar un nuevo elemento de secuencia de comandos, se realiza mediante la manipulación dinámica del DOM y se conoce como inyección de elementos de secuencia de comandos . El <script>elemento se inyecta en el DOM HTML, con la URL del punto final JSONP deseado establecido como el atributo "src". Esta inyección de elemento de script dinámico generalmente se realiza mediante una biblioteca auxiliar de JavaScript. jQuery y otros marcos tienen funciones auxiliares JSONP; también hay opciones independientes.

Un ejemplo del uso de jQuery para inyectar dinámicamente un elemento de script para una llamada JSONP se ve así:

$ . getScript ( "http://server.example.com/Users/192.168.73.96?callback=parseResponse" );

Después de que se inyecta el elemento, el navegador evalúa el elemento y realiza un HTTP GET en la URL src, recuperando el contenido. Luego, el navegador evalúa la carga útil de retorno como JavaScript. Suele ser una invocación de función. De esa manera, el uso de JSONP puede permitir que las páginas del navegador funcionen con la política del mismo origen a través de la inyección de elementos de script. [ cita requerida ]

El script se ejecuta dentro del alcance de la página incluida y, como tal, todavía está sujeto a restricciones entre dominios en relación con el dominio de la página incluida. Esto significa que una página web no puede, por ejemplo, cargar una biblioteca alojada en otro sitio a través de JSONP y luego realizar solicitudes XMLHttpRequest a ese sitio (a menos que se admita el intercambio de recursos de origen cruzado (CORS)), aunque se podría usar dicha biblioteca para hacer XMLHttpRequests en su propio sitio.

Problemas de seguridad [ editar ]

Código de terceros que no es de confianza [ editar ]

La inclusión de elementos de secuencia de comandos de servidores remotos permite a los servidores remotos inyectar cualquier contenido en un sitio web. Si los servidores remotos tienen vulnerabilidades que permiten la inyección de JavaScript, la página servida desde el servidor original está expuesta a un mayor riesgo. Si un atacante puede inyectar JavaScript en la página web original, ese código puede recuperar JavaScript adicional de cualquier dominio, sin pasar por la política del mismo origen . [5] El encabezado HTTP de la política de seguridad de contenido permite que los sitios web indiquen a los navegadores de qué dominio se pueden incluir los scripts.

Alrededor de 2011 se realizó un esfuerzo para definir una definición de subconjunto estricta más segura para JSONP [1] que los navegadores podrían aplicar en solicitudes de script con un tipo MIME específico como "application / json-p". Si la respuesta no se analizó como JSONP estricto, el navegador podría arrojar un error o simplemente ignorar la respuesta completa. Sin embargo, este enfoque se abandonó en favor de CORS y permanece el tipo MIME correcto para JSONP application/javascript. [6]

Diferencias de espacios en blanco [ editar ]

JSONP conlleva los mismos problemas que resolver JSON con eval(): ambos interpretan el texto JSON como JavaScript, lo que significa diferencias en el manejo de U + 2028 y U + 2029 de JSON propiamente dicho. Esto hace que algunas cadenas JSON no sean legales en JSONP; los servidores que sirven JSONP deben escapar de estos caracteres antes de la transmisión. [7]

Manipulación de nombre de devolución de llamada y ataque de descarga de archivo reflejado [ editar ]

Se pueden usar nombres de devolución de llamada no desinfectados para pasar datos maliciosos a los clientes, evitando las restricciones asociadas con el application/jsontipo de contenido, como se demostró en el ataque de descarga de archivos reflejados (RFD) de 2014. [8]

Los puntos finales JSONP inseguros también se pueden inyectar con datos maliciosos. [9]

Falsificación de solicitudes entre sitios [ editar ]

Las implementaciones ingenuas de JSONP están sujetas a ataques de falsificación de solicitudes entre sitios (CSRF o XSRF). [10] Debido a que el <script>elemento HTML no respeta la política del mismo origen en las implementaciones del navegador web, una página maliciosa puede solicitar y obtener datos JSON pertenecientes a otro sitio. Esto permitirá que los datos codificados en JSON se evalúen en el contexto de la página maliciosa, posiblemente divulgando contraseñas u otros datos confidenciales si el usuario está conectado actualmente al otro sitio.

Esto es problemático solo si los datos codificados en JSON contienen información confidencial que no debe ser revelada a un tercero, y el servidor depende de la política del mismo origen del navegador para bloquear la entrega de la información confidencial.

Rosetta Flash [ editar ]

Rosetta Flash es una técnica de explotación que permite a un atacante explotar servidores con un punto final JSONP vulnerable al hacer que Adobe Flash Player crea que un subprograma Flash especificado por el atacante se originó en el servidor vulnerable. Flash Player implementa una política del mismo origen que permite realizar solicitudes (con cookies) y recibir respuestas del sitio de alojamiento. A continuación, el subprograma puede enviar los datos recuperados al atacante. Este es un exploit de origen cruzado con un impacto similar al de incrustar un subprograma Flash arbitrario en el dominio vulnerable. El exploit utiliza una carga útil de ActionScript compilada en un archivo SWF compuesto en su totalidad por caracteres alfanuméricos mediante la creación de un flujo zlib con un encabezado particular y DEFLATEbloques con codificación Huffman ad-hoc . A continuación, el archivo SWF alfanumérico resultante se utiliza como parámetro de devolución de llamada de una llamada JSONP. Los sitios de alto perfil como Google, YouTube, Twitter, Yahoo !, Yandex, LinkedIn, eBay, Instagram y Tumblr eran todos vulnerables hasta julio de 2014. [11] Esta vulnerabilidad fue descubierta y publicada por el ingeniero de seguridad de Google Michele Spagnuolo [12] y tiene CVE - 2014-4671 [13] y CVE- 2014-5333 . [14] La versión 14.0.0.145 de Adobe Flash Player, lanzada el 8 de julio de 2014, introdujo una validación más sólida de los archivos Flash, [15]y en la versión 14.0.0.176, lanzada el 12 de agosto de 2014, finalizó la corrección, [16] impidiendo que este exploit funcione.

Historia [ editar ]

En julio de 2005, George Jempty sugirió que se antepusiera una asignación de variable opcional a JSON. [17] [18] La propuesta original para JSONP, donde el relleno es una función de devolución de llamada, parece haber sido realizada por Bob Ippolito en diciembre de 2005 [19] y ahora es utilizada por muchas aplicaciones Web 2.0 como Dojo Toolkit , Google Web Kit de herramientas y servicios web .

Ver también [ editar ]

  • Uso compartido de recursos de origen cruzado (CORS)
  • Mensajería entre documentos

Referencias [ editar ]

  1. ^ a b "Ajax entre dominios más seguro con JSON-P / JSONP" . JSON-P.org . Archivado desde el original el 4 de marzo de 2016 . Consultado el 30 de octubre de 2011 .
  2. ^ Ippolito, Bob (5 de diciembre de 2005). "JSON remoto - JSONP" . Bob Ippolito en Haskell, Python, Erlang, JavaScript, etc . Archivado desde el original el 8 de junio de 2012 . Consultado el 10 de febrero de 2017 .
  3. ^ "Uso compartido de recursos de origen cruzado" . ¿Puedo usar .. . Consultado el 4 de mayo de 2020 .
  4. ^ "Resultado de RDF experimental establecido en el traductor JSON" . Archivado desde el original el 15 de noviembre de 2014 . Consultado el 20 de febrero de 2012 .
  5. Ben Hayak (17 de octubre de 2014). "Ejecución del mismo método de origen" (PDF) . Consultado el 22 de octubre de 2014 .
  6. Gray, Eli (27 de junio de 2010). "¿Es esto seguro para proporcionar JSONP?" . stackoverflow.com . Consultado el 7 de septiembre de 2012 .
  7. ^ "JSON: el subconjunto de JavaScript que no lo es" . Magnus Holm . Consultado el 16 de mayo de 2011 .
  8. ^ Oren Hafif (2014). "Descarga de archivos reflejados: un nuevo vector de ataque web" . TrustWave . Consultado el 25 de marzo de 2015 .
  9. ^ "Práctica inyección JSONP" .
  10. ^ Grossman, Jeremiah (27 de enero de 2006). "Técnicas avanzadas de ataque web usando GMail" . Consultado el 3 de julio de 2009 .
  11. ^ Michele, Spagnuolo. "Abusar de JSONP con Rosetta Flash" . Archivado desde el original el 21 de julio de 2014 . Consultado el 20 de julio de 2014 .
  12. ^ "Google: lista de vulnerabilidades de software descubiertas o reparadas por los empleados de Google" . Consultado el 29 de julio de 2014 .
  13. ^ "MITRE: CVE-2014-4671" . Consultado el 29 de julio de 2014 .
  14. ^ "MITRE: CVE-2014-5333" . Consultado el 21 de agosto de 2014 .
  15. ^ "Boletín de seguridad de Adobe APSB14-17" . Consultado el 29 de julio de 2014 .
  16. ^ "Boletín de seguridad de Adobe APSB14-18" . Consultado el 21 de agosto de 2014 .
  17. ^ "evaluar JSON" . 19 de julio de 2005. Archivado desde el original el 12 de febrero de 2006.
  18. ^ "json: Mensaje: Re: Comentarios" . 17 de agosto de 2005.
  19. ^ "JSON remoto - JSONP" . de __future__ import * . Bob.pythonmac.org. 5 de diciembre de 2005. Archivado desde el original el 4 de diciembre de 2009 . Consultado el 8 de septiembre de 2008 .

Enlaces externos [ editar ]

  • El filtro del lado del servidor envuelve cualquier respuesta en una devolución de llamada jsonp  , hecho con el código fuente jsonp-java
  • Posibles problemas de seguridad relacionados con JSON
  • Fuente de datos JSONP para dominios remotos