2012-02-06 26 views
10

No estoy seguro de entender qué tipo de vulnerabilidades esto causa.¿Qué hace que el dominio cruzado ajax sea inseguro?

Cuando necesito acceder a los datos de una API, tengo que usar ajax para solicitar un archivo PHP en mi propio servidor, y ese archivo PHP accede a la API. ¿Qué hace que esto sea más seguro que simplemente permitirme acceder a la API directamente con ajax?

Para el caso, parece que al usar JSONP http://en.wikipedia.org/wiki/JSONP puede hacer todo lo que el dominio cruzado ajax le permite hacer.

¿Podría alguien aclararme?

+1

Pertenece a http://security.stackexchange.com/ – Knu

Respuesta

12

Creo que está malinterpretando el problema que la política del mismo origen está tratando de resolver.

Imagine que estoy conectado a Gmail, y que Gmail tiene un recurso JSON, http : //mail.google.com/information-about-current-user.js, con información sobre el usuario que ha iniciado sesión. Se supone que este recurso está destinado a ser utilizado por la interfaz de usuario de Gmail, pero si no fuera por la misma política de origen, cualquier sitio que visité y que sospechaba que podría ser un usuario de Gmail podría ejecutar una solicitud de AJAX para obtenerlo. recurso como yo, y recuperar información sobre mí, sin que Gmail pueda hacer mucho al respecto.

Por lo tanto, la política del mismo origen no es proteger su página PHP del sitio de terceros; y no es para proteger a alguien que visita su página PHP desde el sitio de terceros; más bien, es para proteger a alguien que visite su página PHP y cualquier sitio de terceros al que tenga acceso especial, desde su página PHP. (El "acceso especial" puede ser debido a cookies, HTTP AUTH o una lista blanca de direcciones IP, o simplemente estar en la red correcta — quizás alguien trabaje en la NSA y visite su sitio, eso no significa que deba estar capaz de desencadenar un volcado de datos desde una página interna de la NSA.)

JSONP evita esto de una manera segura, introduciendo una limitación diferente: solo funciona si el recurso es JSONP. Entonces, si Gmail quiere que un recurso JSON determinado pueda ser utilizado por terceros, puede admitir JSONP para ese recurso, pero si solo quiere que ese recurso pueda ser utilizado por su propia interfaz de usuario, puede admitir solo JSON simple.

+0

Esta es una buena descripción del problema. Mi malentendido fue pensar que el problema provenía de qué sitios distintos a los que estaba podría hacerle. El problema es realmente lo que el sitio que estás visitando actualmente puede hacerte. Ahora tiene mucho más sentido. – Joren

0

Con cross site scripting, usted tendría una página web que podría extraer datos de cualquier lugar y luego poder ejecutarlos en el mismo contexto que sus otros datos en la página y, en teoría, tener acceso a la cookie y otra información de seguridad a la que no le gustaría tener acceso. Las secuencias de comandos de sitios cruzados serían muy inseguras a este respecto, ya que podría ir a cualquier página y, si permitía, la secuencia de comandos en esa página solo podría cargar datos desde cualquier lugar y luego comenzar a ejecutar código incorrecto, por lo que no está permitido.

JSONP por el contrario le permite obtener datos en formato JSON porque proporciona la devolución de llamada necesaria para que los datos pasen, por lo que le da la medida de control en que los datos no serán ejecutados por el navegador a menos que la devolución de llamada function does y exec o intenta ejecutarlo. Los datos estarán en formato JSON para que pueda hacer lo que desee, sin embargo, no se ejecutará, por lo tanto, es más seguro y, por lo tanto, la razón por la que está permitido.

+0

Pero un sitio web ya puede extraer datos de cualquier lugar y ejecutarlos en el contexto de la página actual. Puedo poner y el navegador lo ejecutará felizmente con permiso completo. Aquí es donde tengo confusión. – Joren

+0

Pero eso no tendrá ningún acceso a javascript desde otro sitio web, de ahí la seguridad detrás de scripts entre sitios. – darren102

+2

Tengo una impresión de JSONP muy diferente a la que tuvo al leer el artículo de Wikipedia JSONP: lo que se devuelve con solicitudes JSONP explícitamente no es JSON, sino JavaScript arbitrario que a menudo incluye datos en formato JSON además de definiciones de funciones o ejecuciones . – sarnold

2

Muchos servicios web no están diseñados para resistir XSRF, por lo que si un sitio web puede cargar datos del programa mediante una solicitud que transmite cookies entre dominios solo en virtud del usuario que ha visitado el sitio, cualquier persona con la capacidad ejecutar javascript puede robar datos de usuario.

CORS es una alternativa segura planificada a XHR que resuelve el problema por not carrying credentials by default. La especificación CORS explica el problema:

Los agentes de usuario aplican comúnmente las mismas restricciones de origen a las solicitudes de red. Estas restricciones impiden que una aplicación web del lado del cliente que se ejecuta desde un origen obtenga datos recuperados de otro origen y también limitan las solicitudes HTTP inseguras que se pueden iniciar automáticamente hacia destinos que difieren del origen de la aplicación en ejecución.

En los agentes de usuario que siguen este patrón, las solicitudes de red suelen utilizar la autenticación ambiental y la información de gestión de sesión, incluida la autenticación HTTP y la información de cookies.

EDIT:

El problema con sólo hacer el trabajo XHR entre dominios es que muchos servicios web exponen ambient authority. Normalmente esa autoridad solo está disponible para codificar desde el mismo origen.

Esto significa que un usuario que confía en un sitio web está confiando en todo el código de ese sitio web con sus datos privados. El usuario confía en el servidor al que le envían los datos y cualquier código cargado por las páginas servidas por ese servidor. Cuando las personas detrás de un sitio web y las bibliotecas que carga son confiables, la confianza del usuario está bien ubicada.

Si XHR funcionaba con origen cruzado y transportaba cookies, esa autoridad ambiente estaría disponible para codificar a cualquiera que pueda servir código al usuario. Las decisiones de confianza que el usuario tomó anteriormente pueden no estar bien ubicadas.

CORS no hereda estos problemas porque los servicios existentes no exponen la autoridad ambiental a CORS.

+1

Corrígeme si me equivoco: no tiene que ser una vulnerabilidad XSRF si se envían datos confidenciales como respuesta a una solicitud HTTP perfectamente válida con cookies de sesión correctas y todo eso. De lo contrario, básicamente, cada sitio web con un sistema de inicio de sesión sería vulnerable a XSRF según su definición. –

+1

Así que estás diciendo que la diferencia entre hacer ping en una url con ajax y hacer ping con PHP es que el ajax se comporta como si fuera el usuario el que visita esa página, y el PHP se comporta como si fuera el servidor que está ejecutando PHP. al visitar esa página? – Joren

+0

@Joren: Exactamente eso. –

1

El patrón de JS->Server(PHP)->API hace que sea posible y no solo la mejor, sino una práctica esencial para verificar con cordura lo que obtienes mientras pasa por el servidor. Además de eso, cosas como los resolvedores locales equilibrados (aka DNS Worms) etc. son mucho menos probables en un servidor, que en algún cliente aleatorio.

En cuanto a JSONP: Esto no es un bastón, sino una muleta. En mi humilde opinión, podría verse como un exploit contra una mala característica del combo HTML/JS, que no se puede eliminar sin romper el código existente. Otros podrían pensar diferente de esto.

Mientras JSONP permite que permite ejecutar código de unreflectedly somwhere en el mal en todo el mundo, nadie fuerzas que lo hagan. Todas las implementaciones de JSONP siempre utilizan algún tipo de hash, etc. para verificar que el proveedor de ese código es confiable. De nuevo, otros pueden pensar diferente.

0

El original XHR nunca fue diseñado para permitir solicitudes de origen cruzado. La razón era una vulnerabilidad de seguridad tangible que se conoce principalmente por CSRF attacks.

En este escenario de ataque, un sitio de terceros puede obligar a un agente de usuario de la víctima a enviar solicitudes falsas pero válidas y legítimas al sitio de origen. Desde la perspectiva del servidor de origen, dicha solicitud falsificada no es indiscernible de otras solicitudes de ese usuario que fueron iniciadas por las páginas web del servidor de origen. La razón de esto es porque en realidad es el agente de usuario el que envía estas solicitudes y también incluiría automáticamente cualquier credencial, como cookies, autenticación HTTP e incluso certificados SSL del lado del cliente.

Ahora estas solicitudes se pueden falsificar fácilmente: comenzando con simples solicitudes GET usando <img src="…"> hasta solicitudes POST usando formularios y enviándolos automáticamente.Esto funciona siempre y cuando sea predecible cómo forjar tales solicitudes válidas.

Pero esta no es la razón principal para prohibir las solicitudes de origen cruzado para XHR. Porque, como se muestra arriba, hay formas de falsificar solicitudes incluso sin XHR e incluso sin JavaScript. No, la razón principal por la que XHR no permitió las solicitudes de origen cruzado es porque sería el JavaScript en la página web del tercero al que se enviaría la respuesta. Por lo tanto, no solo sería posible enviar solicitudes de origen cruzado sino también recibir la respuesta que pueda contener información confidencial a la que luego accedería el JavaScript.

Es por eso que la especificación original XHR no permitió solicitudes de origen cruzado. Pero a medida que la tecnología avanza, hubo solicitudes razonables para apoyar solicitudes de origen cruzado. Es por eso que la especificación XHR original se extendió a XHR level 2 (XHR y XHR nivel 2 ahora están fusionados) donde la extensión principal es para admitir solicitudes de origen cruzado bajo requisitos particulares que se especifican como CORS. Ahora el servidor tiene la capacidad de verificar el origen de una solicitud y también puede restringir el conjunto de orígenes permitidos, así como el conjunto de métodos HTTP permitidos y campos de encabezado.

Ahora en JSONP: para obtener la respuesta JSON de una solicitud en JavaScript y poder procesarla, debería ser una solicitud de origen idéntico o, en el caso de una solicitud de origen cruzado, su servidor y el agente de usuario necesitaría soportar CORS (del cual este último solo es compatible con los navegadores modernos). Pero para poder trabajar con cualquier navegador, se inventó JSONP que es simplemente una llamada de función de JavaScript válida con el JSON como un parámetro que se puede cargar como un JavaScript externo a través de <script> que, similar a <img>, no está restringido al mismo origen peticiones. Pero además de cualquier otra solicitud, una solicitud JSONP también es vulnerable a CSRF.

Así que para concluir que desde el punto de vista de la seguridad: se requiere

  • XHR para realizar solicitudes de recursos de JSON para obtener sus respuestas en JavaScript
  • XHR2/CORS se requiere para hacer las solicitudes de origen cruzado por los recursos de JSON para obtener sus respuestas en JavaScript
  • JSONP es una solución para eludir las solicitudes de origen cruzado con XHR

Pero también:

  • solicitudes de forja es de risa fácil, aunque forjar las solicitudes válidas y legítimas es más difícil (pero a menudo bastante fácil así)
  • ataques CSRF son un no deben subestimar la amenaza, por lo que aprender a protect against CSRF
Cuestiones relacionadas