En raison de sa capacité à communiquer avec le serveur, l'objet XMLHttpRequest (XHR), utilisés dans la technologie Ajax (un acronyme pour Asynchronous JavaScript and XML, qui doit être prononcé "egiacs" bien que nous préférons italien "aiacs»), a un verrou de sécurité qui vous empêche d'exécuter des applications en dehors du domaine dans lequel il opère. Cette protection est nécessaire pour empêcher l'injection JavaScript (techniques de "l'injection" extrêmement dangereuse du code afin de casser le système) de différents types, avec l'objectif ultime de «pause» dans le système.
Cette limite est désormais prise au sérieux et vous êtes la pensée, en quelque sorte, pour le résoudre - directement dans le XmlHttpRequest - sans compromettre la sécurité (voir aussi: Troisième proposition pour le cross-site des extensions de XMLHttpRequest ).
Quelle que soit la situation d'aujourd'hui est comme suit:
Le code JavaScript qui utilise l'objet XMLHttpRequest (yourWebApp.html sur la page) ne peuvent faire des demandes dans le domaine miodominio.com, c'est à dire le domaine où le code Javascript. Offrir ce scénario type, alors:
... Ne fonctionnera pas!
Par ailleurs, comme indiqué sur la règle d'origine de Mozilla:
[..] Mozilla considère deux pages à l'origine ont un examen si le protocole, le port (si donnée), et l'hôte sont les mêmes pour les deux pages. Pour l'illustre ce tableau donne des exemples de comparaisons d'origine à l'URL http://store.company.com/dir/page.html .
Il ne s'agit pas seulement du domaine pour rendre les choses difficiles. En outre, considérer que chaque navigateur a sa propre implémentation de l'objet XMLHttpRequest et ensuite ses propres règles.
Quoi qu'il en soit pour résoudre ce problème il existe différentes techniques.
1. Serveur Proxy
Cette technique utilise un langage côté serveur pour "truc", pour ainsi dire, l'objet XHR, afin de créer un tunnel entre l'objet XHR, et nos objectifs de domaine externe. PHP, par exemple, est capable de récupérer des informations provenant d'autres domaines de différentes manières, selon le type d'installation et les restrictions sur notre serveur. Dans le cas général que nous avons tendance à faire est la suivante:
En un mot l'objet XHR communique avec notre domaine, où une page spécialement écrite récupère les informations d'un domaine externe. Il crée ensuite un proxy en PHP, qui est une «page travers" qui récupère les informations pour nous, retournant objet XHR. Un des serveur proxy simple proprosta est, par exemple, à partir 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 / / Exemple de proxy PHP pour les services Web de Yahoo!. / / HTTP répond aux requêtes GET et POST deux / / / / Auteur: Jason Levitt / / Décembre 7th, 2005 / / / / Admis hostname (api.local et api.travel également possibles sont ici) 'HOSTNAME' , 'http://search.yahooapis.com/' ) ; définir ('hostname', 'http://search.yahooapis.com/'); / / Obtenir le chemin d'appel REST de l'application AJAX / / Est-ce un POST ou GET pour? ( $_POST [ 'yws_path' ] ) ? $_POST [ 'yws_path' ] : $_GET [ 'yws_path' ] ; $ Path = ($ _POST ['yws_path']) $ _POST ['Yws_path']:? $ _GET ['Yws_path']; HOSTNAME . $path ; HOSTNAME = $ url $ Path.; / / Ouvrir la session Curl curl_init ( $url ) ; $ Session = curl_init ($ url); / / Si c'est un POST, mettre les données POST dans le corps $_POST [ 'yws_path' ] ) { if ($ _POST ['yws_path']) { '' ; Postvars $ =''; $element = current ( $_POST ) ) { while ($ element = actuelle ($ _POST)) { key ( $_POST ) . '=' . $element . '&' ; Postvars .= $ clef .. ($ _POST) '=' $ element '&'.; $_POST ) ; suivante ($ _POST); } $session , CURLOPT_POST , true ) ; curl_setopt ($ session, CURLOPT_POST, true); $session , CURLOPT_POSTFIELDS , $postvars ) ; curl_setopt ($ session, CURLOPT_POSTFIELDS, postvars $); } / / Ne pas retourner en-têtes HTTP. Ne retourner le contenu de l'appel $session , CURLOPT_HEADER , false ) ; curl_setopt ($ session, CURLOPT_HEADER, false); $session , CURLOPT_RETURNTRANSFER , true ) ; curl_setopt ($ session, CURLOPT_RETURNTRANSFER, true); / / Faire l'appel curl_exec ( $session ) ; $ Xml = curl_exec ($ session); / / Le service Web retourne XML. Réglez le type de contenu de manière appropriée "Content-Type: text/xml" ) ; tête ("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() . Dans ce codcie vous utilisez curl , une bibliothèque connue PHP utilisé pour contourner les restrictions sur les plus simples et bien connus des commandes fopen() , fread() etc ... Il suffirait, en fait, ouvert la cible sur notre domaine externe avec l'une des nombreuses fonctions mis à notre disposition par PHP, comme readfile() . Malheureusement, souvent, ces fonctions sont désactivées ou limitées sur certains hôtes, pour des raisons de sécurité. Le curl , cependant, sont presque toujours disponibles.
2. La bonne vieille TAG IFRAME
Je me souviens encore quand en 1996 l'une des premières techniques implementai Scripting à distance (comme il s'appelait à l'époque où l'Ajax était juste un détergent). La balise IFRAME est encore utilisé aujourd'hui, maltraités, aimé et méprisé, selon le programmeur qui l'utilise. La balise IFRAME est souvent salué comme une «chose à faire", une porte dangereuse pour un hacker. En fin de compte, puis, avec l'introduction de l'objet XmlHttpRequest navigateur, l'IFRAME est encore plus méprisé par les «puristes Ajax." En fait, il est encore beaucoup utilisé, tant pour l'inclusion des Widgets, Gadgets et antipixel au blog (si vous avez un blog est probable que votre page est pleine de "trous" IFRAME et ne savent même pas), est de contourner toute le blocage ou l'absence de l'objet XMLHttpRequest mêmes.
Un IFRAME ouvre un navigateur dans le navigateur. Cette fenêtre peut afficher un domaine IFRAME externe et est accessible à partir du code Javascript dans la page principale. Voici une autre façon de contourner le blocage objet XMLHttpRequest.
3. D'autres techniques
Il ya aussi beaucoup d'autres alternatives s'il ya lieu et les circonstances dans lesquelles nous sommes (vous pouvez installer des outils spécifiques ou de manipuler le serveur Web à un niveau bas). di apache o librerie come JSON per superare il problema. Vous pouvez utiliser mod_rewrite ou mod_proxy Apache ou des bibliothèques comme JSON pour surmonter le problème.
D'autres techniques (suivre le lien ci-dessous sur le "voir aussi") sont des variations sympa, mais certains ont des restrictions sur les navigateurs qui les soutiennent, soyez donc prudent. Le meilleur, à mon avis, est l'utilisation d'un serveur proxy simple avec PHP.
4. Flash
Permettez-moi d'ajouter éclair entre les techniques de surmonter les inter-domaine, si ce n'est que parce que j'ai parlé dans un précédent post: l'Ajax sans le HTTPRequête . Flash, bien sûr, n'a rien à voir avec l'objet XHR, et plus que jamais, rien à voir avec Javascript. Cependant, gardez à l'esprit certaines caractéristiques importantes:
- Une animation Flash peut interagir avec JavaScript et le DOM de la page Web
- Javascript peut interagir avec une animation Flash
- Adobe AIR est un système dans lequel le HTML, Javascript / Ajax et Flash coexister dans une harmonieuse et fonctionnelle
Flash, contrairement objet XHR, donc pas de restrictions sur l'accès inter-domaines contraignant. Dans Flash il ya un certain nombre de caractéristiques visant à la sécurité et de contrôle d'accès dans deux domaines différents est celui dans lequel "tourne" notre film. Toutefois, ils sont facilement défini par le code et dépendent en grande partie sur les choix de svilupparore qui a écrit le code. Accès, par conséquent, d'un fichier RSS de n'importe quel domaine est, en Flash, ce qui est très simple. Par ailleurs, au lieu d'utiliser une page PHP comme un proxy, vous pouvez profiter de la capacité de communiquer avec Flash et JavaScript, et ensuite l'utiliser comme un proxy.
Un exemple de serveur proxy PHP pour tous les
Un exemple simple de la façon d'écrire une page PHP qui exécute un serveur proxy, minimes, j'utilise très souvent ... ![]()
1 2 3 4 5 6 7 8 9 10 11 | $url ) { getContent fonction ($ url) { curl_init ( ) ; $ Ch = curl_init (); 5 ; // set to zero for no timeout $ Timeout = 5; / / mise à zéro pour les pas de timeout $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); Fichier / / Affichage $file_contents ) ; retour (file_contents $); } |
Cette fonction simple exploite les bibliothèques curl pour accéder à une page qui pourrait être, par exemple, un flux XML RSS. De cette façon, un appel Ajax recevra le résultat utilisant cette serveurs proxy PHP simples.











Publié récemment, voir aussi: Cross Domain Ajax
undolog  »Blog Archive » Serveur de tunnels et de proxy pour Ajax et plus ...
En raison de sa capacité à communiquer avec le serveur € ™ s XMLHttpRequest (XHR), utilisé à Ajax (un acronyme pour Asynchronous JavaScript and XML, qui devrait être prononcé un œegiacsâ € €? Même si nous préférons italienne un œaiacs € ...
Bel article, je vais "deliciousizzo« à la volée
[...] Equipez-vous avec un proxy (tunnel) en raison des protections imposées par les deux technologies (voir les serveurs proxy et les tunnels pour l'Ajax et au-delà). Si votre site ou blog SimplePie est déjà présent, vous pouvez écrire un proxy simple [...]