Foros del Web » Programando para Internet » Javascript »

ajax y dominio cruzado

Estas en el tema de ajax y dominio cruzado en el foro de Javascript en Foros del Web. Buenas, Estoy un poco confuso con el impedimento de hacer peticiones ajax a dominios cruzados. Creo que no entiendo el concepto porque yo puedo hacer ...
  #1 (permalink)  
Antiguo 21/05/2014, 01:15
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 18 años, 4 meses
Puntos: 32
ajax y dominio cruzado

Buenas,

Estoy un poco confuso con el impedimento de hacer peticiones ajax a dominios cruzados. Creo que no entiendo el concepto porque yo puedo hacer esta petición ajax al dominio api.openweathermap.org siendo mi dominio localhost:

Código HTML:
Ver original
  1. <!DOCTYPE html>
  2. <title>Hola Mundo con AJAX</title>
  3.  
  4. <script type="text/javascript">
  5. function descargaArchivo() {
  6.   // Obtener la instancia del objeto XMLHttpRequest
  7.   if(window.XMLHttpRequest) {
  8.     peticion_http = new XMLHttpRequest();
  9.   }
  10.   else if(window.ActiveXObject) {
  11.     peticion_http = new ActiveXObject("Microsoft.XMLHTTP");
  12.   }
  13.  
  14.   // Preparar la funcion de respuesta
  15.   peticion_http.onreadystatechange = muestraContenido;
  16.  
  17.   // Realizar peticion HTTP
  18.   peticion_http.open('GET', 'http://api.openweathermap.org/data/2.5/weather?q=London,uk', true);
  19.   peticion_http.send(null);
  20.  
  21. }
  22.  
  23. function muestraContenido() {
  24.   if(this.readyState == 4) {
  25.     if(this.status == 200) {
  26.       var json = JSON.parse(this.responseText);
  27.       alert( json );
  28.     }
  29.   }
  30. }
  31.  
  32. window.onload = descargaArchivo;
  33.  
  34.  
  35. </head>
  36. </html>

¿Que es lo que se me escapa?

Un saludo!
__________________
github.com/xgbuils | npm/xgbuils
  #2 (permalink)  
Antiguo 21/05/2014, 02:07
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: ajax y dominio cruzado

La configuración de tu localhost? Que esta lo permita no quiere decir que te lo vaya a permitir otras configuraciones.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 21/05/2014 a las 02:15
  #3 (permalink)  
Antiguo 21/05/2014, 04:29
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 18 años, 4 meses
Puntos: 32
Respuesta: ajax y dominio cruzado

Pensaba que lo de impedir acceder a dominios cruzados era algo implementado por el navegador. De todas maneras como el virtual host es en xampp y en windows así para hacer alguna prueba, no me he preocupado de configurar nada. He creado un virtual host en un servidor ubuntu que tengo externo y la petición ajax sigue funcionando:

http://test.trantor.co.vu/

En todo caso, ¿algún tipo de información que me lo aclare? Pues estoy buscando por otro lado como consumir de un web service SOAP con javascript y mucha de la referencia que encuentro me habla del problema de cross-domain. Por eso me extraña que para este ejemplo que pongo con json no haya ningún problema ni tenga que usar jsonp o otras historias que se cuentan.

Un saludo!
__________________
github.com/xgbuils | npm/xgbuils
  #4 (permalink)  
Antiguo 21/05/2014, 06:52
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: ajax y dominio cruzado

Hola:

Es como tú piensas, pero en tu caso se admite porque el servidor al que consultas (openweathermap) devuelve en su cabecera http permisos para ser consultado desde cualquier dominio. La cabecera http de respuesta de openweathermap que puedes ver con las herramientas de debug de google chrome por ejemplo, contiene esto

Access-Control-Allow-Credentials:true
Access-Control-Allow-Methods:GET, POST
Access-Control-Allow-Origin:*

donde Access-Control-Allow-Origin:* indica que se pueden hacer peticiones desde cualquier dominio (localhost en tu caso).

Te cuento un poco el motivo de la restricción de dominios cruzados y porqué es el dominio consultado el que tiene que dar el permiso.

Imagina que yo estoy en mi casa o en el trabajo con mi router y tengo cuatro o cinco PCs en mi red interna con un servidor web activo. Desde un pc navego y cargo una web de internet que tenga mala leche. El código javascript de esa página se ejecuta en mi PC y dentro de mi red, por lo que podría pedir consultas web a otros PCs de mi red interna y enviar información a su servidor. Se agrava el tema si encima por temas de cookies tengo sesión abierta en esos PCs internos, por lo que javascript accedería incluso con mi usuario y mis permisos en las web internas de mis PCs. Este es el motivo por el que existe la restricción de peticiones cruzadas: evitar que un servidor externo por medio de javascript pueda acceder a recursos de mi red interna.

Y es por eso que el permiso para hacer peticiones cruzadas debe darlo el que recibe la petición cruzada (mis PCs de mi red) y no el servidor web con la página original. Si mis PCs no devuelven nada en la cabecera http relativo a permisos de control cruzado, están por defecto no accesibles y el navegador no deja acceder a ellos. Si mis PCs indican que sí se puede acceder, el navegador sí dejará acceder a ellos aunque sea una petición cruzada.

Se bueno.
__________________
Apuntes Java
Wiki de Programación

Última edición por chuidiang; 21/05/2014 a las 06:59
  #5 (permalink)  
Antiguo 23/05/2014, 00:12
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 18 años, 4 meses
Puntos: 32
Respuesta: ajax y dominio cruzado

Gracias chuidiang.

He leído tu post varias veces y la segunda parte sobretodo me está costando de entender. Así que no he respondido hasta tener un rato para poder analizarlo con detalle.

Cita:
Iniciado por chuidiang
Es como tú piensas, pero en tu caso se admite porque el servidor al que consultas (openweathermap) devuelve en su cabecera http permisos para ser consultado desde cualquier dominio. La cabecera http de respuesta de openweathermap que puedes ver con las herramientas de debug de google chrome por ejemplo, contiene esto

Access-Control-Allow-Credentials:true
Access-Control-Allow-Methods:GET, POST
Access-Control-Allow-Origin:*

donde Access-Control-Allow-Origin:* indica que se pueden hacer peticiones desde cualquier dominio (localhost en tu caso).
Gracias. He probado de crear un web service SOAP en PHP con lo que has dicho. A parte del header:

Access-Control-Allow-Origin:*

He tenido que poner la siguiente linea:

Access-Control-Allow-Headers:Origin, X-Requested-With, Content-Type, Accept
Aún no he investigado por qué, pero sino no podía hacer una petición ajax al web service.

Cita:
Imagina que yo estoy en mi casa o en el trabajo con mi router y tengo cuatro o cinco PCs en mi red interna con un servidor web activo.
Imaginaré que en cualquier sitio tienes una red con 5 PCs y un servidor web activo.

Cita:
Desde un pc navego
¿Un pc de la red u otro externo a la red?

Cita:
y cargo una web de internet que tenga mala leche. El código javascript de esa página se ejecuta en mi PC y dentro de mi red
Ah, de acuerdo. Cargas una página web maliciosa desde un PC que está dentro de la red, he de entender.

Cita:
, por lo que podría pedir consultas web a otros PCs de mi red interna y enviar información a su servidor.
Vale, si me dices que la web maliciosa puede pedir consultas web a otros PCs de tu red, yo entiendo que es porque el mismo dominio apunta diferentes PCs de tu red.
¿Me lo imagino bien?


Cita:
Se agrava el tema si encima por temas de cookies tengo sesión abierta en esos PCs internos, por lo que javascript accedería incluso con mi usuario y mis permisos en las web internas de mis PCs.
No acabo de entender porque tienes sesión abierta en esos PCs? ¿Son PCs servidores o clientes? Yo pensaba que eran servidores por eso de tener un servidor web activo. La verdad es que me ha líado mucho la explicación por no separar cuales son máquinas servidoras de cuales son clientes. Por eso propongo otro escenario a ver si así me aclaro.

Simplifiquemos las cosas. Actores de la historia:
Servidor B: contiene una web bienitencionada(aunque posiblemente corruptible introduciendole algun script): webbuena.com
Servidor M: contiene una web maliciosa: webmala.com
Cliente: usa el navegador para cargar alguna de las páginas de los servidores B o M.

Vamos a suponer que no existe la política del mismo origen en los navegadores y a ver que ocurriría en diferentes casos que voy a exponer:

CASO 1:
La web maliciosa contiene algun script que obtiene y envia datos de webbuena.com

CASO 2:
A la web bienintencionada le introducen algun script que hace que pueda obtener o enviar datos de la web maliciosa.

Me cuesta entender como a través de una petición AJAX la respuesta a dicha petición puede traer consigo las cookies. Pues en teoría devuelve una cadena de texto en formato XML o JSON. Es muy importante para mi entenderlo para luego poder aplicar la seguridad conveniente a través de la directiva Access-Control-Allow-Origin.

Un saludo y gracias.
__________________
github.com/xgbuils | npm/xgbuils
  #6 (permalink)  
Antiguo 23/05/2014, 01:07
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: ajax y dominio cruzado

Hola:

Imagina en tu red dos PCs, en uno navegas tú y el otro tiene un servidor web arrancado. Imagina que sus nombres son pc1 (en el que navegas) y el otro es pc2 ( accesible desde pc1 por medio de http://pc2 ) pero que no está accesible desde internet.

Si desde pc1 cargas un sitio web malicioso de internet (por ejemplo http://sitiomalo ), ese sitio malo puede enviarte código javascript que se ejecutará en tu pc1 y que intente hacer consultas a http://pc2 que sí está accesible desde pc1 . Sin protección de crosssitescripting, el código javascript de sitiomalo puede cargar páginas de http://pc2 y enviar su contenido a http://sitiomalo/tomaContenidoPirateado.

Si además http://pc2 está protegido con usuario y password y estás con sesión abierta desde pc1, http://sitiomalo accederá como si estuviera en sesión ya que http://pc2 sabe que tu navegador le está pidiendo cosas desde pc1 y hay un usuario con sesión abierta. El tema de cookies lo maneja el navegador por defecto, si tienes una sesión abierta lo habitual es guardarla en una cookie. Cada vez que el navegador hace una petición a un dominio (sea ajax o normal), envía la cookie de ese dominio si la tiene.

Se bueno.
__________________
Apuntes Java
Wiki de Programación

Última edición por chuidiang; 23/05/2014 a las 01:57

Etiquetas: ajax, cruzado, dominio, funcion, html, js
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:29.