Servidores de túnel y el proxy, y no sólo para el Ajax

Debido a su capacidad de comunicarse con el servidor, el objeto XMLHttpRequest (XHR), utilizado en la tecnología Ajax (que significa Asynchronous JavaScript y XML, que debe pronunciarse "egiacs" Incluso si nosotros, los italianos prefieren "aiacs"), tiene un candado de seguridad que le impide ejecutar aplicaciones fuera del ámbito en el que opera. Esta protección es necesaria para evitar el Javascript de inyección (técnicas de "inyección" de código extremadamente peligroso con el fin de romper el sistema) de diversos tipos, con el objetivo último de "break" en el sistema.
Este límite se toma ahora en consideración seria y usted está pensando, de alguna manera, para resolverlo - objeto XMLHttpRequest directamente - sin comprometer la seguridad (véase también: tercera propuesta de extensiones de cross-site a XMLHttpRequest ).

Sin embargo, la situación actual es como sigue:

XHR

El código de JavaScript que utiliza el objeto XMLHttpRequest (en la página de yourWebApp.html) sólo pueden hacer peticiones a la miodominio.com de dominio, es decir, el dominio en el código Javascript. La prestación de este tipo de escenario, entonces:

XHR

No funciona ...!

Por otra parte, como se muestra en la política del mismo origen de Mozilla:

[..] Mozilla considera dos páginas para que el origen de examen si el protocolo, el puerto (si se le da), y el anfitrión es el examen de dos páginas. Para muestra esta tabla se incluyen ejemplos de comparaciones de origen a la URL http://store.company.com/dir/page.html .

La política del mismo origen

No es sólo el dominio para hacer las cosas difíciles. Además, tenga en cuenta que cada navegador tiene su propio objeto XMLHttpRequest aplicación y sus propias reglas.
De todos modos para resolver este problema hay varias técnicas.

1. Proxy Server

Esta técnica utiliza un lenguaje de servidor de "engañar", por así decirlo, el objeto XHR a fin de crear un túnel entre el objeto y nuestro objetivo XHR dominio externo. PHP, por ejemplo, es capaz de recuperar información de otros dominios de diversas maneras, de acuerdo con el tipo de restricciones de instalación y de conjunto en nuestro servidor. En el caso general que tendemos a hacer es lo siguiente:

XHR

En resumen, el objeto XHR se comunica con nuestro dominio, donde una página escrita especialmente recupera la información de un dominio externo. Hay, pues, de un proxy en PHP, es decir, una "página a través de" que recupera la información para nosotros, volviendo objeto XHR. Uno de los más simple servidor proxy es proprosto, por ejemplo, de Yahoo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<? Php
/ / PHP ejemplo de proxy para los servicios web de Yahoo!.
/ / Responde tanto HTTP GET y POST
/ /
/ / Autor: Jason Levitt
/ / 07 de diciembre 2005
/ /

/ / Con el nombre de host (api.local y api.travel También son posibles aquí)
'HOSTNAME' , 'http://search.yahooapis.com/' ) ; define ('host', 'http://search.yahooapis.com/');

/ / Obtener la ruta de llamada REST de la aplicación AJAX
/ / ¿Es un POST o GET uno?
( $_POST [ 'yws_path' ] ) ? $_POST [ 'yws_path' ] : $_GET [ 'yws_path' ] ; $ Path = ($ _POST ['yws_path']) $ _POST ['Yws_path']: $ _GET ['yws_path'];
HOSTNAME . $path ; . Url = $ HOSTNAME $ Path;

/ / Abre la sesión CURL
curl_init ( $url ) ; $ Session = curl_init ($ url);

/ / Si se trata de una petición POST, poner los datos POST en el cuerpo
$_POST [ 'yws_path' ] ) { if ($ _POST ['yws_path']) {
'' ; $ Postvars ='';
$element = current ( $_POST ) ) { while ($ elemento = corriente ($ _POST)) {
key ( $_POST ) . '=' . $element . '&' ; $ Postvars =. clave ($ _POST) '=' $ element '&'...;
$_POST ) ; próxima ($ _POST);
}
$session , CURLOPT_POST , true ) ; curl_setopt ($ session, CURLOPT_POST, true);
$session , CURLOPT_POSTFIELDS , $postvars ) ; curl_setopt ($ session, CURLOPT_POSTFIELDS, $ postvars);
}

/ / No devuelva las cabeceras HTTP. No devolver el contenido de la llamada
$session , CURLOPT_HEADER , false ) ; curl_setopt ($ session, CURLOPT_HEADER, false);
$session , CURLOPT_RETURNTRANSFER , true ) ; curl_setopt ($ session, CURLOPT_RETURNTRANSFER, true);

/ / Realizar la llamada
curl_exec ( $session ) ; $ Xml = curl_exec ($ session);

/ / El servicio web devuelve XML. Establecer el tipo de contenido adecuadamente
"Content-Type: text/xml" ) ; cabecera ("Content-Type: text / xml");

; echo $ xml;
$session ) ; curl_close ($ session);
>

, fread() etc… Basterebbe, infatti, aprire la destinazione sul nostro dominio esterno con una delle tante funzioni messe a disposzione da PHP, come readfile() . En este codcie utiliza curl , una conocida librería PHP utilizado para eludir las restricciones a la mayoría de los comandos simples y conocidas fopen() , fread() etc ... sería suficiente, de hecho, abrir el destino de nuestro dominio externo con una de las muchas funciones puesto a nuestra disposición por PHP, como readfile() . Por desgracia, a menudo estas funciones están deshabilitadas o limitadas en algún hospedaje, por razones de seguridad. El curl , sin embargo, son casi siempre disponibles.

2. La buena vieja etiqueta IFRAME

Todavía recuerdo cuando en 1996 implementai una de las primeras técnicas de secuencias de comandos a distancia (como se llamaba entonces, cuando el Ajax era más que un detergente). La etiqueta IFRAME se sigue utilizando hoy en día, objeto de abuso, amado y despreciado, según el programador que lo utiliza. La etiqueta IFRAME es a menudo aclamado como "qué no hacer", una peligrosa puerta a un hacker. En última instancia, a continuación, con la introducción en el objeto XMLHttpRequest navegador, el IFRAME se desprecia aún más por el "puristas Ajax". En realidad, todavía se utiliza mucho, tanto para la inclusión de widgets, gadgets y antipixel en el blog (si tienes un blog, es probable que su página está llena de "agujeros" IFRAME y no saben aún), es evitar cualquier bloque o la falta de la XmlHttpRequest mismo objeto.
Un hecho IFRAME, se abre un navegador en el navegador. Esta ventana puede mostrar un dominio de IFRAME externa y se puede acceder con JavaScript en la página de los padres. Aquí está una manera diferente de pasar por alto el objeto XMLHttpRequest de bloqueo.

3. Otras técnicas

También hay muchas otras alternativas, según proceda y las circunstancias en las que estamos (se pueden instalar herramientas específicas para manipular el servidor Web o de bajo nivel). di apache o librerie come JSON per superare il problema. Usted puede utilizar mod_rewrite o mod_proxy de apache o en las bibliotecas como JSON para superar el problema.
Otras técnicas (seguir el enlace de más abajo en el "véase también") son variaciones agradables, pero algunos tienen restricciones en los navegadores que las soportan, así que ten cuidado. Lo mejor, en mi opinión, es el uso de un servidor proxy en PHP.

4. Flash

Permítanme añadir Flash entre las técnicas de superación de la cruz-dominio, aunque sólo sea porque ya he mencionado en un post anterior: Ajax sin HTTPRequest . Flash, por supuesto, no tiene nada que ver con el objeto XHR, y más que nunca, nada que ver con JavaScript. Sin embargo, tenga en cuenta algunas características importantes:

  1. Una película Flash puede interactuar con JavaScript y el DOM de la página web
  2. Javascript puede interactuar con una película de Flash
  3. Adobe AIR es un sistema en el que HTML, Javascript / Ajax y Flash convivir en forma armoniosa y funcional

Flash, a diferencia de objeto XHR, así que no hay restricciones en el acceso entre dominios vinculante. En Flash hay una serie de características dirigidas a la seguridad y control de acceso a diferentes dominios de la que es "convertir" nuestra película. Sin embargo son fácilmente establecido por el código y mucho dependerá de las decisiones de svilupparore que escribió el código. Inicie sesión y, a continuación, a un archivo RSS de un dominio es, en Flash, que es muy simple. Por otra parte, en lugar de utilizar una página PHP como un proxy, puede tomar ventaja de la capacidad de comunicarse con Javascript y Flash y luego usarlo como un servidor proxy.

Un ejemplo de un servidor proxy para todos los PHP

Un ejemplo sencillo de cómo escribir una página PHP que se ejecuta un servidor proxy, mínima, utilizo muy a menudo ... ;)

1
2
3
4
5
6
7
8
9
10
11
$url ) { getContent función ($ url) {
curl_init ( ) ; $ Ch = curl_init ();
5 ; // set to zero for no timeout $ Tiempo de espera = 5; / / set a cero para ningún tiempo de espera
$ch , CURLOPT_URL , $url ) ; curl_setopt ($ ch, CURLOPT_URL, $ url);
$ch , CURLOPT_RETURNTRANSFER , 1 ) ; curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1);
$ch , CURLOPT_CONNECTTIMEOUT , $timeout ) ; curl_setopt ($ ch, CURLOPT_CONNECTTIMEOUT, $ timeout);
curl_exec ( $ch ) ; $ File_contents = curl_exec ($ ch);
$ch ) ; curl_close ($ ch);
/ / Visualización del archivo
$file_contents ) ; return ($ file_contents);
}

Esta función simple utiliza solamente las bibliotecas enrollamiento para acceder a una página que podría ser, por ejemplo, un XML Feed RSS. De esta manera, una llamada Ajax recibirá los resultados a través de este servidor proxy simples PHP.

Véase también

4 comentarios a "El servidor de túnel y de proxy para el Ajax y más allá"

  1. 10 de diciembre 2007 Giovambattista Fazioli :

    Publicado recientemente, véase también: Ajax entre dominios

  2. 10 de diciembre 2007 upnews.it :

    undolog  »Blog Archive » Servidor de túneles y de proxy para el Ajax y más ...

    Debido a su capacidad de comunicarse con el servidor de € ™ s objeto XMLHttpRequest (XHR), utilizado en el Ajax (que significa Asynchronous JavaScript y XML, que debe ser pronunciado â € œegiacsâ €? Incluso si nosotros, los italianos prefieren â € œaiacs ...

  3. 22 de enero 2008 Napolux :

    Gran artículo, voy a "deliciousizzo" sobre la marcha : D

  4. 22 de diciembre 2008 truco muy corto: proxy RSS con SimplePie | Undolog.com :

    [...] Equípate con un proxy (túnel) a causa de las protecciones impuestas por ambas tecnologías (ver servidores de túneles y un proxy para el Ajax y más allá). Si su sitio web o blog de SimplePie ya está presente, puede escribir un proxy simple [...]

Deja un comentario

TAG PERMISOS XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> código de inserción:
 <pre></pre> // blocco generico <code></code> // blocco generico [cc_actionscript][/cc_actionscript] // Actionscript [cc_actionscript3][/cc_actionscript3] // Actionscript 3 [cc_css][/cc_css] // CSS Style Sheet [cc_html][/cc_html] // HTML [cc_js][/cc_js] // Javascript [cc_objc][/cc_objc] // Objective-C [cc_php][/cc_objc] // PHP [cc_sql][/cc_sql] // SQL 


Deje de SOPA