2008-11-25 8 views
10

Voici le problème:domaine Cross requête Ajax à partir de fichier js

1.) Nous avons la page ici ... www.blah.com/mypage.html

2.) cette page demande un js fichier www.foo.com comme ça ...

<script type="text/javascript" src="http://www.foo.com/jsfile.js" /> 

3.) "jsfile.js" utilise Prototype pour faire revenir à www.foo.com une requête Ajax.

4.) La requête ajax appelle www.foo.com/blah.html. La fonction de rappel obtient la réponse html et la jette dans un div.

Cela ne semble pas fonctionner, je suppose que c'est XSS. Est-ce exact?

Si oui, comment puis-je résoudre ce problème? Existe-t-il un autre moyen d'obtenir mon code HTML de www.foo.com sur www.blah.com sur le client sans utiliser un iframe?

+1

Il ya vraiment un bon article concernant la requête ajax cross domain - http://tek-insight.blogspot.com/2010/05/cross-domain-ajax-request-proxy-json.html –

Répondre

14

C'est XSS et c'est interdit. Vous ne devriez vraiment pas faire les choses de cette façon. Si vous en avez vraiment besoin, faites en sorte que votre code AJAX appelle le code local (PHP, ASP, peu importe) sur blah.com et faites en sorte qu'il se comporte comme un client et récupérez tout ce dont vous avez besoin sur foo.com et renvoyez-le à client. Si vous utilisez PHP, vous pouvez le faire avec fopen ('www.foo.com/blah.html', 'r') et ensuite lire le contenu comme s'il s'agissait d'un fichier normal.

Bien sûr, allow_remote_url_fopen (ou quel que soit le nom exact) doit être activé dans votre fichier php.ini.

2

Une option consiste à implémenter une page proxy qui prend l'URL nécessaire en tant que paramètre. par exemple. http://blah.com/proxy?uri=http://foo.com/actualRequest

+2

Vous feriez mieux de faire un peu de validation dessus pour vous assurer que l'URL est celle que vous attendez ... sinon c'est un trou de sécurité majeur. – rmeador

+1

Bien sûr. Je pensais que c'était implicite quand j'ai dit «mettre en œuvre». – Rohit

0

La méthode illustrée ci-dessus pourrait devenir un grand trou de sécurité. Suggérez de vérifier le nom du site par rapport à une liste blanche et de créer l'adresse URI réelle en cours de transmission côté serveur.

6

Il existe un w3c proposal permettant aux sites de spécifier d'autres sites autorisés à effectuer des requêtes intersites. (Wikipedia pourrait vouloir autoriser toutes les demandes d'articles, par exemple, mais google mail ne voudrait pas autoriser les demandes - puisque cela pourrait permettre à n'importe quel site Web ouvert lorsque vous êtes connecté à google mail de lire votre courrier).

Ceci pourrait être disponible dans le futur.

+3

La proposition actuelle du W3C est appelée ["Cross-Origin Resource Sharing"] (http://www.w3.org/TR/cors/), communément appelée ** CORS **. – hippietrail

0

Pour les hits inter-domaines, ceci est un bon exemple de travail et est maintenant considéré comme un "standard" http://www.xml.com/pub/a/2005/12/21/json-dynamic-script-tag.html.

il y a d'autres façons aussi bien, par exemple iframes injection avec document.domain modifié

http://fettig.net/weblog/2005/11/28/how-to-make-xmlhttprequest-connections-to-another-server-in-your-domain/

J'Agre encore que la voie facile appelle un proxy dans un même domaine mais ce n'est pas vraiment côté client Appel WS.

3

Comme mentionné ci-dessus JSONP est un moyen de contourner ce. Toutefois, le site sur lequel vous demandez les données doit prendre en charge JSONP afin que vous puissiez l'utiliser sur le client. (JSONP injecte essentiellement une balise de script dans la page, et fournit une fonction de rappel qui devrait être appelée avec les résultats)

Si le site sur lequel vous faites une demande ne prend pas en charge JSONP, vous devrez transmettre la demande par procuration sur votre site. serveur. Comme mentionné ci-dessus, vous pouvez le faire sur votre propre serveur ou ce que j'ai fait dans le passé est d'utiliser un http://www.jsonpit.com, ce qui permettra de demander la demande par procuration.

Questions connexes