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:
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:
... 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.
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:
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
- / / Exemple PHP Proxy pour Yahoo! Les services Web.
- / / Répond à la fois les requêtes GET et HTTP POST
- / /
- / / Auteur: Jason Levitt
- / / Décembre 7th, 2005
- / /
- / / Hostname intérieure (api.local et api.travel sont également possibles)
- 'HOSTNAME' , 'http://search.yahooapis.com/' ) ; define ( 'hostname', 'http://search.yahooapis.com/');
- / / Obtenir le chemin d'appel REST de l'application AJAX
- / / Est-ce un POST ou GET?
- ( $_POST [ 'yws_path' ] ) ? $_POST [ 'yws_path' ] : $_GET [ 'yws_path' ] ; $ Path = ($ _POST [ 'yws_path'])? $ _POST [ 'Yws_path']: $ _GET [ 'yws_path'];
- HOSTNAME . $path ; $ Url = HOSTNAME. $ PATH;
- / / Ouvre la session Curl
- / / Si c'est un POST, mettre les données POST dans le corps
- $_POST [ 'yws_path' ] ) { if ($ _POST [ 'yws_path']) (
- '' ; $ Postvars ='';
- )
- $session , CURLOPT_POSTFIELDS , $postvars ) ; curl_setopt ($ session, CURLOPT_POSTFIELDS, postvars $);
- )
- / / Ne pas remettre en-têtes HTTP. Ne pas retourner le contenu de l'appel
- / / Faire l'appel
- / / Les retours de services Web XML. Réglez le Content-Type appropriée
- ; echo $ xml;
- ?>
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:
- Une animation Flash peut interagir avec le Javascript et le DOM de la page Web
- JavaScript peut interagir avec une animation Flash
- 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 ... ![]()
- $url ) { function getContent ($ url) (
- 5 ; // set to zero for no timeout Timeout = 5 $, / / set à zéro pour des pas de timeout
- / / Afficher le fichier
- $file_contents ) ; return ($ file_contents);
- )
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
- Comment faire XMLHttpRequest appels vers un autre serveur dans votre domaine
- AJAX: XMLHTTPRequest cross-domain contournement des restrictions
- Cross-domain XMLHttpRequest














Paru récemment, voir aussi: Ajax inter-domaine
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 ...
Excellent article, je vais "deliciousizzo" à la volée
[...] 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 [...]