De túnel y los servidores proxy para Ajax y más allá
Lunes, 10 de diciembre de 2007 Debido a su capacidad para comunicarse con el servidor, el objeto XMLHttpRequest (XHR), utilizado en la tecnología Ajax (abreviatura de JavaScript asíncrono y XML, cuya pronunciación sería "egiacs" incluso si los italianos prefieren "aiacs"), ha un bloque de protección que le impide ejecutar aplicaciones fuera del ámbito en el que opera. Esta protección es necesaria para evitar la inyección Javascript (técnicas de "inyección" extremadamente peligroso en el código para violar el sistema), de variados tipos, con el objetivo final de "break" en el sistema.
Este límite es ahora tomado en serio y está pensando en alguna forma de resolverlo - directamente en XMLHttpRequest - sin poner en peligro la seguridad (véase también: Tercera propuesta de cross-site ampliaciones de XMLHttpRequest).
No obstante, la situación hoy es como sigue:
El código javascript que utiliza el objeto XMLHttpRequest (en este yourWebApp.html) sólo puede hacer peticiones al dominio miodominio.com, a saber, el dominio al que el código JavaScript. Un escenario diquesto tipo, entonces:
... No funciona!
Además, como se indica en el mismo origen Política de Mozilla:
[..] Mozilla considera dos páginas tienen el mismo origen, si el protocolo, el puerto (si existiese), y de acogida son los mismos para ambas páginas. Para ilustrar, este cuadro da ejemplos de comparaciones de origen a la URL http://store.company.com/dir/page.html.
No es sólo el dominio para hacer las cosas difíciles. Además consideró que cada navegador tiene su propia aplicación de XMLHttpRequest y reglas de su personal.
De cualquier manera para resolver el problema, existen diversas técnicas.
1. Servidor Proxy
Esta técnica utiliza un servidor del lado del lenguaje para "engañar", por así decirlo, la XHR objeto de tal manera que para crear un túnel entre el objeto y el XHR nuestro dominio externo objetivo. PHP, por ejemplo, es capaz de recuperar información de otros dominios de varias maneras, según el tipo de instalación y establecer restricciones en nuestro servidor. En el caso general que tienden a hacer es la siguiente:
En resumen XHR coloquios con el objeto de nuestro dominio, especialmente cuando una página escrita recupera la información de un dominio externo. A continuación, crea un proxy en PHP, es decir, una "a través de la página", que recupera la información para nosotros, dando vuelta a XHR. Uno de los más simple servidor proxy es proprosto, por ejemplo, de Yahoo:
- <? Php
- / / PHP proxy ejemplo para Yahoo! Los servicios Web.
- / / Responde a ambos HTTP GET y POST, las solicitudes
- / /
- / / Autor: Jason Levitt
- / / 7 de diciembre de 2005
- / /
- / / Permitido el nombre de host (api.local api.travel y también son posibles aquí)
- 'HOSTNAME' , 'http://search.yahooapis.com/' ) ; define ( 'HOSTNAME', 'http://search.yahooapis.com/');
- / / Obtener el resto de la llamada ruta de la aplicación AJAX
- / / ¿Es un puesto o una LLEGAR?
- $_POST [ 'yws_path' ] ) ? $_POST [ 'yws_path' ] : $_GET [ 'yws_path' ] ; $ Path = ($ _POST [ 'yws_path'])? $ _POST [ 'Yws_path']: $ _GET [ 'yws_path'];
- ; $ Url = HOSTNAME. $ PATH;
- / / Abrir el período de sesiones Abarquillamiento
- $url ) ; $ = Curl_init período de sesiones ($ url);
- / / Si se trata de un POST, poner los datos POST en el cuerpo
- $_POST [ 'yws_path' ] ) { if ($ _POST [ 'yws_path']) (
- ; $ Postvars ='';
- )
- , CURLOPT_POST, true ) ; curl_setopt ($ período de sesiones, CURLOPT_POST, true);
- , CURLOPT_POSTFIELDS, $postvars ) ; curl_setopt ($ período de sesiones, CURLOPT_POSTFIELDS, $ postvars);
- )
- / / No volver cabeceras HTTP. Hacer regresar el contenido de la convocatoria
- , CURLOPT_HEADER, false ) ; curl_setopt ($ período de sesiones, CURLOPT_HEADER, false);
- , CURLOPT_RETURNTRANSFER, true ) ; curl_setopt ($ período de sesiones, CURLOPT_RETURNTRANSFER, true);
- / / Realizar la llamada
- $session ) ; $ Xml = curl_exec ($ período de sesiones);
- / / El servicio Web XML devuelve. Ajuste el Content-Type adecuadamente
- ) ; curl_close ($ período de sesiones);
- >
En este codcie el uso de curl una conocida librería PHP utilizado para eludir las restricciones a la más simple conocido y comandos fopen() fread() etc ... Basta ya, de hecho, abra el destino de nuestro dominio externo con una de las muchas funciones hechas por disposiciones PHP, como readfile() Lamentablemente, a menudo estas funciones son discapacitados o limitados en algunos de acogida, por razones de seguridad. El curl sin embargo, están casi siempre disponibles.
2. La buena vieja IFRAME TAG
Todavía recuerdo cuando en 1996 implementai una de las primeras técnicas de secuencias de comandos remoto (como se llamaba en ese momento, cuando el Ajax fue sólo un detergente). El TAG IFRAME aún se utiliza, abusa, adorado y despreciado, según el programador que lo usa. El TAG IFRAME es a menudo señalado como "lo que no se debe hacer", una peligrosa puerta de un hacker. En última instancia, y luego, con la introducción de XMLHttpRequest navegador en el IFRAME es aún más despreciado por los "puristas Ajax". En realidad, aún se utiliza mucho, tanto para la inclusión de Widgets, Gadgets y Antipixel Blogs (si usted tiene un blog es probable que su página está llena de "agujeros" IFRAME ni siquiera saben) o para soslayar cualquier el bloqueo o la falta de objeto XMLHttpRequest.
Un IFRAME abre un navegador dentro del navegador. Este IFRAME ventana puede mostrar un dominio externo y es accesible desde código JavaScript en la página madre. Aquí hay una forma de eludir el bloqueo de XMLHttpRequest.
3. Otras técnicas
Hay muchas otras alternativas, según proceda y las circunstancias en las que estamos (puede instalar el instrumento específico o manipular el servidor Web a la baja). Puede utilizar mod_rewrite o mod_proxy Apache o bibliotecas como JSON para superar el problema.
Otras técnicas (siga el enlace debajo de la "véase también") son agradables variaciones, pero algunos tienen restricciones en navegadores que soportan, de modo cuidadoso. El mejor de los casos, al menos en mi opinión, sigue siendo el uso de un simple servidor proxy en PHP.
4. Flash
Permítaseme insertar Flash entre las técnicas de tolerancia de la condicionalidad de dominio, aunque sólo sea porque he mencionado en un post anterior: Ajax sin HTTPRequest. Flash, por supuesto, nada tiene que ver con la XHR objeto, y más que nunca, nada que ver con Javascript. Pero debemos tener en cuenta algunas características importantes:
- Una película Flash puede interactuar con JavaScript y DOM página Web
- Javascript puede interactuar con un flash
- Adobe AIR es un sistema en el que HTML, Javascript / Ajax y Flash coexisten en un armonioso y funcional
Flash, a diferencia de XHR objeto, no como las restricciones vinculantes sobre las transferencias de dominio. En Flash existe una serie de características destinadas a la seguridad y controlar el acceso a los distintos ámbitos que es "convertir" nuestra película. Sin embargo, son fácilmente establecidos por el código y dependen esencialmente de las opciones de svilupparore que escribió el código. Inicio de sesión, entonces, un archivo RSS de cualquier dominio, es decir, en Flash, algo muy simple. Además, en lugar de utilizar una página PHP como un proxy, puede explotar las capacidades de JavaScript para comunicarse con Flash y luego usarlo como un proxy.
Un ejemplo de PHP de un servidor proxy para todos
Un ejemplo sencillo de cómo escribir una página PHP que se ejecuta un servidor proxy mínimo, he utilizado más a menudo que no ... ![]()
- $url ) { función getContent ($ url) (
- ; $ Ch = curl_init ();
- ; // set to zero for no timeout $ Timeout = 5; / / puesta a cero de no tiempo
- , CURLOPT_URL, $url ) ; curl_setopt ($ ch, CURLOPT_URL, $ url);
- , CURLOPT_RETURNTRANSFER, 1 ) ; curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1);
- , CURLOPT_CONNECTTIMEOUT, $timeout ) ; curl_setopt ($ ch, CURLOPT_CONNECTTIMEOUT, $ tiempo);
- $ch ) ; $ File_contents = curl_exec ($ ch);
- ) ; curl_close ($ ch);
- / / Mostrar el archivo
- $file_contents ) ; return ($ file_contents);
- )
Esta simple función de los usos del bucle sus bibliotecas para acceder a una página que podría ser, por ejemplo, un XML feeds RSS. De este modo, una llamada Ajax recibirá el resultado a través de este simple servidor proxy PHP.
Véase también
- Cómo hacer llamadas XMLHttpRequest a otro servidor en tu dominio
- AJAX: Evitar XMLHttpRequest cruz-restricción de dominio
- Cruz-dominio XMLHttpRequest
Véase también ...
- 23.09.08: jQuery: cómo construir una extensión Plugin (0)
- 21.09.08: Muy breve fragmento: PHP palabra corte (7)
- 17.09.08: jQuery contra todos: un punto de referencia con 5 navegador (3)
- 15.09.08: Undolibrary MatrixArray: una extensión de la clase array (0)
- 10.09.08: ActionScript 3.0: ¿Sabías que ... (0)



















Giovambattista Fazioli dijo:
Publicado a poco, véase también: Ajax Cruz de dominio
upnews.it dijo:
undolog  »Blog Archive « túnel y los servidores proxy para el Ajax y no sólo ...
Debido a su capacidad para comunicarse con el servidor, la € ™ objeto XMLHttpRequest (XHR), utilizado en la tecnología Ajax (abreviatura de JavaScript asíncrono y XML, cuyo caso debe ser œegiacsâ â € €? A pesar de que los italianos prefieren â € œaiacs ...
Napolux dijo:
Excelente artículo, "deliciousizzo" sobre la marcha