Tunneling et les serveurs proxy pour Ajax et non pas seulement

Lundi, Décembre 10, 2007

En raison de sa capacité à communiquer avec le serveur, l'objet XMLHttpRequest (XHR), qui est utilisé dans la technologie Ajax (qui signifie Asynchronous JavaScript and XML, ce qui devrait être prononcé "egiacs« même si nous, les Italiens préfèrent "aiacs"), a un bloc de protection qui l'empêche d'exécuter les demandes externes au domaine dans lequel elle opère. Cette protection est nécessaire pour empêcher JavaScript Injection (technique "injection" code extrêmement dangereuses afin de casser le système) de différents types, avec pour but ultime de «casser» le système.
Cette limite est désormais prise au sérieux et que vous penser, d'une certaine façon de la résoudre - directement dans l'objet XMLHttpRequest - sans compromettre la sécurité (voir aussi: Troisième proposition pour la Croix-extensions site à XMLHttpRequest).

Quelle que soit la situation aujourd'hui est la suivante:

XHR

Le code JavaScript qui utilise l'objet XMLHttpRequest (trouvé sur yourWebApp.html page) ne peut que faire des demandes au miodominio.com de domaine, c'est à dire le domaine où le code JavaScript. N tel scénario, alors:

XHR

... Ne fonctionnera pas!

En outre, comme indiqué sur la même politique d'origine à Mozilla:

[..] Mozilla considère deux pages pour avoir la même origine si le protocole, le port (si fourni), et d'accueil sont les mêmes pour les deux pages. Pour illustré, ce tableau donne des exemples de comparaisons origine à l'http://store.company.com/dir/page.html URL.

The Same Origin Policy

N'est pas seulement le domaine à faire des choses difficiles. En outre considérer que chaque navigateur possède son propre implémentation de l'objet XMLHttpRequest et puis ses règles personnelles.
Quoi qu'il en soit de résoudre ce problème, il existe différentes techniques.

1. Proxy Server

Cette technique utilise un serveur de langue côté de "truc", pour ainsi dire, l'objet XHR de manière à créer un tunnel entre l'objet XHR et notre objectif de domaine externe. PHP, par exemple, est capable de récupérer des informations issues d'autres domaines de différentes manières, en fonction du type d'installation, et aussi définir des restrictions sur notre serveur. Dans le cas général que nous avons tendance à faire est la suivante:

XHR

En bref, l'objet XHR communique avec notre domaine, où une page spécialement écrite extrait des informations d'un domaine externe. Il crée ensuite un proxy en PHP, ce qui constitue une page "à travers" qui récupère des informations pour nous, le rétablissement de XHR objet. Un des plus simples serveur proxy proprosto est, par exemple, à partir de Yahoo:

PHP:
  1. <? Php
  2. / / Exemple PHP Proxy pour Yahoo! Les services Web.
  3. / / Répond à la fois les requêtes GET et HTTP POST
  4. / /
  5. / / Auteur: Jason Levitt
  6. / / Décembre 7th, 2005
  7. / /
  8. / / Hostname intérieure (api.local et api.travel sont également possibles)
  9. 'HOSTNAME' , 'http://search.yahooapis.com/' ) ; define ( 'hostname', 'http://search.yahooapis.com/');
  10. / / Obtenir le chemin d'appel REST de l'application AJAX
  11. / / Est-ce un POST ou GET?
  12. ( $_POST [ 'yws_path' ] ) ? $_POST [ 'yws_path' ] : $_GET [ 'yws_path' ] ; $ Path = ($ _POST [ 'yws_path'])? $ _POST [ 'Yws_path']: $ _GET [ 'yws_path'];
  13. HOSTNAME . $path ; $ Url = HOSTNAME. $ PATH;
  14. / / Ouvre la session Curl
  15. curl_init ( $url ) ; $ Session = curl_init ($ url);
  16. / / Si c'est un POST, mettre les données POST dans le corps
  17. $_POST [ 'yws_path' ] ) { if ($ _POST [ 'yws_path']) (
  18. '' ; $ Postvars ='';
  19. $element = current ( $_POST ) ) { while ($ element = courant ($ _POST)) (
  20. key ( $_POST ) . '=' . $element . '&' ; Postvars .= $ clef ($ _POST). '='. $ Element. '&';
  21. $_POST ) ; Suivant ($ _POST);
  22. )
  23. $session , CURLOPT_POST , true ) ; curl_setopt ($ session, CURLOPT_POST, true);
  24. $session , CURLOPT_POSTFIELDS , $postvars ) ; curl_setopt ($ session, CURLOPT_POSTFIELDS, postvars $);
  25. )
  26. / / Ne pas remettre en-têtes HTTP. Ne pas retourner le contenu de l'appel
  27. $session , CURLOPT_HEADER , false ) ; curl_setopt ($ session, CURLOPT_HEADER, false);
  28. $session , CURLOPT_RETURNTRANSFER , true ) ; curl_setopt ($ session, CURLOPT_RETURNTRANSFER, true);
  29. / / Faire l'appel
  30. curl_exec ( $session ) ; $ Xml = curl_exec ($ session);
  31. / / Les retours de services Web XML. Réglez le Content-Type appropriée
  32. "Content-Type: text/xml" ) ; (en-tête "Content-Type: text / xml");
  33. ; echo $ xml;
  34. $session ) ; curl_close ($ session);
  35. ?>

Cette codcie vous utilisez curl une connus PHP bibliothèque utilisée pour contourner les restrictions sur les commandes les plus simples et connus fopen() fread() etc ... Il suffit d'ouvrir la destination sur notre domaine externe à l'une des nombreuses fonctions disponibles à notre disposition par PHP, comme readfile() Malheureusement, souvent ces fonctions sont désactivées ou limitées sur certains d'hébergement, pour des raisons de sécurité. La curl cependant, sont presque toujours disponibles.

2. Le bon vieux IFRAME TAG

Je me souviens encore quand, en 1996 implementai l'une des premières techniques de Remote Scripting (comme on l'appelait à l'époque, lorsque l'Ajax était juste un détergent). La balise IFRAME est encore utilisé aujourd'hui, abusé, adoré et méprisé, selon le programmeur qui l'utilise. La balise IFRAME est souvent qualifié de "ne pas faire", une porte dangereuse pour un hacker. En bout de ligne, puis, avec l'introduction de l'objet XMLHttpRequest dans les navigateurs, le cadre est encore plus méprisé par les puristes de l'Ajax "." C'est effectivement encore beaucoup utilisée, tant pour l'intégration de Widgets, gadgets et Antipixel dans les blogs (si vous avez un blog est probable que votre page est pleine de «trous» IFRAME ou même de savoir) ou de contourner un bloc ou de l'absence d'un même objet XMLHttpRequest.
Un IFRAME ouvre un navigateur dans le navigateur. Cette fenêtre permet d'afficher un domaine externe IFRAME et est accessible à partir de code JavaScript sur la page parent. Alors, voici une autre façon de contourner le blocage de l'objet XMLHttpRequest.

3. D'autres techniques

Il ya aussi beaucoup d'autres alternatives comme appropriées et les circonstances dans lesquelles nous sommes (vous pouvez installer des outils spécifiques ou de manipuler le serveur Web à un niveau faible). Vous pouvez utiliser mod_rewrite ou mod_proxy d'Apache ou bibliothèques comme JSON pour surmonter le problème.
D'autres techniques (suivez les liens ci-dessous sur le «voir aussi») sont des variations de Nice, mais certains ont des restrictions sur les navigateurs qui les soutiennent, alors faites attention. La meilleure, du moins à mon avis, est l'utilisation d'un serveur proxy simple dans PHP.

4. Flash

Permettez-moi d'ajouter éclair entre les techniques de surmonter la Croix-domaine, si ce n'est que parce que je l'ai mentionné dans un précédent post: AJAX sans HTTPRequest. Flash, bien sûr, n'a rien à voir avec l'objet XHR et, plus que jamais, rien à voir avec le Javascript. Mais nous devons garder à l'esprit certaines caractéristiques importantes:

  1. Une animation Flash peut interagir avec le Javascript et le DOM de la page Web
  2. JavaScript peut interagir avec une animation Flash
  3. Adobe AIR est un système dans lequel HTML, JavaScript / Ajax et Flash coexister dans une harmonieuse et fonctionnelle

Flash, à la différence d'objet XHR, n'a pas de telles restrictions à la Croix-binding domain. Dans Flash il ya un certain nombre de caractéristiques visant à la sécurité et contrôler l'accès aux différents domaines d'où il est "tournant" notre film. Cependant, ils sont facilement établies par le Code et dépendent largement du choix de svilupparore qui a écrit le code. Conséquent, l'accès à un fichier RSS de n'importe quel domaine est, en Flash, quelque chose de très simple. En outre, au lieu d'utiliser une page PHP comme un proxy, vous pouvez profiter des capacités de Javascript pour communiquer avec Flash, puis l'utiliser comme un proxy.

Un exemple de PHP serveur proxy pour tous

Un simple exemple de la façon d'écrire une page PHP qui s'exécute un serveur proxy minime, que j'ai utilisé assez souvent ... ;)

PHP:
  1. $url ) { function getContent ($ url) (
  2. curl_init ( ) ; $ Ch = curl_init ();
  3. 5 ; // set to zero for no timeout Timeout = 5 $, / / set à zéro pour des pas de timeout
  4. $ch , CURLOPT_URL , $url ) ; curl_setopt ($ ch, CURLOPT_URL, $ url);
  5. $ch , CURLOPT_RETURNTRANSFER , 1 ) ; curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1);
  6. $ch , CURLOPT_CONNECTTIMEOUT , $timeout ) ; curl_setopt ($ ch, CURLOPT_CONNECTTIMEOUT, $ timeout);
  7. curl_exec ( $ch ) ; File_contents $ = curl_exec ($ ch);
  8. $ch ) ; curl_close ($ ch);
  9. / / Afficher le fichier
  10. $file_contents ) ; return ($ file_contents);
  11. )

Cette fonction simple utilise seulement la bibliothèque curl pour accéder à une page qui pourrait être, par exemple, un flux XML RSS. De cette manière, un appel recevra les résultats via Ajax ce simple proxy serveur PHP.

Voir aussi

Related Post

Cet article était utile?: Per nientePocoAbbastanzaMoltoMoltissimo
Loading ... Chargement ...

4 commentaires pour "Tunneling et les serveurs proxy pour Ajax et pas seulement"

  1. getAvatar 1.0
  2. getAvatar 1.0
    10 décembre 2007 upnews.it:

    Undolog  »Archives du Blog » Tunneling et les serveurs proxy pour Ajax et plus encore ...

    En raison de sa capacité à communiquer avec le serveur, l'objet € ™ XMLHttpRequest (XHR), utilisés dans la technologie Ajax (acronyme de Asynchronous JavaScript and XML, qui devrait être prononcé œegiacsâ â € €? Bien que nous, les Italiens préfèrent â € œaiacs ...

  3. getAvatar 1.0
    22 janvier 2008 Napolux:

    Excellent article, je vais "deliciousizzo" à la volée : D

  4. getAvatar 1.0
    22 décembre 2008 Très court astuce: proxy avec SimplePie RSS | Undolog.com:

    [...] Vous équiper d'un proxy (tunnel) en raison des mesures de protection imposées par les deux technologies (voir le tunnel et les serveurs proxy pour Ajax et pas seulement). Si votre site ou votre blog est déjà SimplePie, vous pouvez rédiger une procuration simple [...]

Laissez un commentaire

TAG PERMISSIONS XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> INSERTION CODE:
 <pre></pre>         // blocco generico [code][/code]       // blocco generico [as][/as]           // Actionscript [css][/css]         // CSS Style Sheet [html][/html]       // HTML [js][/js]           // Javascript [objc][/objc]       // Objective-C [php][/php]         // PHP [sql][/sql]         // SQL