Tunneling e servidores proxy, e não apenas para Ajax

Devido à sua capacidade de se comunicar com o servidor, o objeto XMLHttpRequest (XHR), usado na tecnologia Ajax (um acrônimo para Asynchronous JavaScript and XML, que deve ser pronunciado "egiacs" embora nós preferimos italiano "aiacs"), tem uma trava de segurança que impede a execução de aplicações fora do domínio em que opera. Essa proteção é necessária para evitar JavaScript Injection (técnicas de "injeção" extremamente perigoso código, a fim de quebrar o sistema) de vários tipos, com o objectivo último de "break" no sistema.
Este limite é agora levado a sério e você está pensando, de alguma forma, para resolvê-lo - diretamente no XmlHttpRequest - sem comprometer a segurança (veja também: terceira proposta de cross-site extensões para XMLHttpRequest ).

Seja qual for a situação de hoje é a seguinte:

XHR

O código JavaScript que usa o objeto XMLHttpRequest (yourWebApp.html na página) só pode fazer pedidos para o domínio miodominio.com, ou seja, o domínio onde o código Javascript. Entrega deste tipo de cenário, então:

XHR

... Não funciona!

Além disso, como mostrado na política de mesma origem da Mozilla:

[..] Mozilla considera duas páginas de ter a origem exame se o protocolo, a porta (se houver), e de acolhimento são as mesmas para ambas as páginas. Para ilustrado esta tabela dá exemplos de comparações de origem para o URL http://store.company.com/dir/page.html .

A política de mesma origem

Não é apenas o domínio para tornar as coisas difíceis. Além disso, considere que cada navegador tem sua própria implementação do objeto XMLHttpRequest e depois as suas próprias regras.
De qualquer maneira para resolver este problema, existem várias técnicas.

1. Servidor Proxy

Esta técnica utiliza uma linguagem server-side de "truque", por assim dizer, o objeto XHR, de modo a criar um túnel entre o objeto XHR, e nossas metas domínio externo. PHP, por exemplo, é capaz de recuperar informações de outros domínios de várias maneiras, de acordo com o tipo de instalação e definir restrições em nosso servidor. No caso geral que tendemos a fazer é esta:

XHR

Em poucas palavras o objeto XHR se comunica com o nosso domínio, onde uma página especialmente escrita recupera informações de um domínio externo. Em seguida, cria um proxy em PHP, que é uma "página por meio de" que recupera informações para nós, retornando objeto XHR. Uma das mais simples servidor proxy proprosta é, por exemplo, do 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
/ / Exemplo Proxy PHP para os serviços Web do Yahoo!.
/ / Responde a HTTP GET e POST Ambos
/ /
/ / Autor: Jason Levitt
/ / 07 de dezembro de 2005
/ /

/ / Hostname admitidos (api.local e api.travel Também é possível aqui)
'HOSTNAME' , 'http://search.yahooapis.com/' ) ; define ('HOSTNAME', 'http://search.yahooapis.com/');

/ / Pega o caminho da chamada REST da aplicação AJAX
/ / É um POST ou GET para?
( $_POST [ 'yws_path' ] ) ? $_POST [ 'yws_path' ] : $_GET [ 'yws_path' ] ; $ Caminho = ($ _POST ['yws_path']) $ _POST ['Yws_path']: $ _GET ['yws_path'];
HOSTNAME . $path ; Url = $ HOSTNAME $ Path.;

/ / Abra a sessão CURL
curl_init ( $url ) ; $ Session = curl_init ($ url);

/ / Se for um POST, colocar os dados POST no corpo
$_POST [ 'yws_path' ] ) { if ($ _POST ['yws_path']) {
'' ; $ Postvars ='';
$element = current ( $_POST ) ) { while ($ elemento = atual ($ _POST)) {
key ( $_POST ) . '=' . $element . '&' ; Postvars .= $ chave .. ($ _POST) '=' elemento $ '&'.;
$_POST ) ; próxima ($ _POST);
}
$session , CURLOPT_POST , true ) ; curl_setopt ($ session, CURLOPT_POST, true);
$session , CURLOPT_POSTFIELDS , $postvars ) ; curl_setopt ($ session, CURLOPT_POSTFIELDS, $ postvars);
}

/ / Não volte cabeçalhos HTTP. Fazer retornar o conteúdo da chamada
$session , CURLOPT_HEADER , false ) ; curl_setopt ($ session, CURLOPT_HEADER, false);
$session , CURLOPT_RETURNTRANSFER , true ) ; curl_setopt ($ session, CURLOPT_RETURNTRANSFER, true);

/ / Faz a chamada
curl_exec ( $session ) ; $ Xml = curl_exec ($ session);

/ / O serviço retorna web XML. O conjunto Content-Type Apropriadamente
"Content-Type: text/xml" ) ; header ("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() . Neste codcie você usa curl , uma biblioteca PHP conhecido usado para contornar as restrições sobre os comandos mais simples e bem conhecido fopen() , fread() etc ... Seria o suficiente, de fato, abrir o destino do nosso domínio externo com uma das muitas funções colocar à nossa disposição pelo PHP, como readfile() . Infelizmente, muitas vezes estas funções são desativadas ou limitadas em alguns host, por razões de segurança. A curl , entretanto, são quase sempre disponível.

2. Os bons velhos TAG IFRAME

Ainda me lembro quando em 1996 um dos primeiros implementai técnicas de Remote Scripting (como era chamado na época em que Ajax era apenas um detergente). A tag IFRAME ainda hoje é usado, abusado, amado e desprezado, dependendo do programador que usa-lo. A tag IFRAME é muitas vezes saudado como uma "coisa a fazer", uma porta perigosa para um hacker. Em última instância, então, com a introdução no objeto XmlHttpRequest navegador, o IFRAME é ainda mais desprezado pelos "puristas Ajax." Na verdade, é ainda muito utilizada, tanto para a inserção de Widgets, Gadgets e antipixel no Blog (se você tiver um blog é provável que sua página está cheia de "buracos" IFRAME e nem sabe), é ignorar qualquer bloqueio ou falta de XmlHttpRequest mesmo objeto.
Um IFRAME abre um navegador dentro do browser. Esta janela pode exibir um IFRAME domínio externo e é acessível a partir de código Javascript no pai página. Aqui está uma maneira diferente de ignorar o XmlHttpRequest objeto de bloqueio.

3. Outras técnicas

Há também muitas outras alternativas conforme o caso e as circunstâncias em que estamos (você pode instalar ferramentas específicas ou manipular o servidor Web para o baixo nível). di apache o librerie come JSON per superare il problema. Você pode usar mod_rewrite ou mod_proxy apache ou bibliotecas como JSON para superar o problema.
Outras técnicas (siga o link abaixo sobre o "ver também") são variações bom, mas alguns têm restrições sobre browsers que os suportam, então seja cuidadoso. O melhor, na minha opinião, é o uso de um servidor proxy simples com PHP.

4. Flash

Permita-me acrescentar o Flash entre as técnicas de superar o cross-domain, mesmo porque eu mencionei em um post anterior: Ajax sem o HTTPRequest . Flash, é claro, não tem nada a ver com o objeto XHR, e mais do que nunca, nada a ver com Javascript. No entanto, tenha em mente algumas características importantes:

  1. Um filme do Flash pode interagir com JavaScript eo DOM da página web
  2. Javascript pode interagir com um filme do Flash
  3. Adobe AIR é um sistema em que HTML, Javascript / Ajax e Flash coexistem em um harmonioso e funcional

Flash, ao contrário do objeto XHR, por isso não há restrições sobre a ligação de acesso entre domínios. No Flash há uma série de funcionalidades que visam a segurança e controle de acesso em dois domínios diferentes é aquele em que "transformar" o nosso filme. No entanto, eles são facilmente definido pelo código e dependem em grande parte nas escolhas dos svilupparore que escreveu o código. Acesso, portanto, para um arquivo de RSS de qualquer domínio é, em Flash, que é muito simples. Além disso, em vez de usar uma página PHP como um proxy, você pode tirar vantagem da capacidade de se comunicar com Flash e JavaScript e usá-lo como um proxy.

Um exemplo de PHP do servidor proxy para todos os

Um exemplo simples de como escrever uma página PHP que executa um servidor proxy, o mínimo, eu uso com muita frequência ... ;)

1
2
3
4
5
6
7
8
9
10
11
$url ) { getContent função ($ url) {
curl_init ( ) ; $ Ch = curl_init ();
5 ; // set to zero for no timeout $ Timeout = 5; / set / a zero para nenhum tempo limite
$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);
Arquivo / Display /
$file_contents ) ; return ($ file_contents);
}

Esta função simples explora as bibliotecas curl para acessar uma página que pode ser, por exemplo, um XML Feed RSS. Desta forma uma chamada Ajax receberá o resultado usando essa servidores proxy simples PHP.

Veja também

4 comentários para "Servidor Proxy Tunneling e para o Ajax e mais além"

  1. 10 de dezembro de 2007 upnews.it :

    undolog  »Blog Archive » Servidor Proxy Tunneling e para Ajax e muito mais ...

    Devido à sua capacidade de se comunicar com o servidor de € ™ s XMLHttpRequest (XHR), usado em Ajax (um acrônimo para Asynchronous JavaScript and XML, o que deve ser pronunciado â € œegiacsâ €? Embora nós preferimos italiano â € œaiacs ...

  2. 22 jan 2008 Napolux :

    Ótimo artigo, eu vou "deliciousizzo" on the fly : D

  3. 22 de dezembro de 2008 Muito curto truque: proxy RSS com SimplePie | Undolog.com :

    [...] Equipar-se com um proxy (tunneling) por causa da proteção imposta por ambas as tecnologias (ver servidores de tunelamento e proxy para Ajax e além). Se o seu site ou blog é SimplePie já está presente, você pode escrever uma procuração simples [...]

Deixe um comentário

XHTML PERMIT TAG: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> CÓDIGO DE INSERÇÃO:
 <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