Croix de domaine ajax POST dans chrome
Il y a plusieurs sujets sur le problème avec la croix-domaine de l'AJAX. J'ai été en regardant ces et la conclusion semble être ceci:
En dehors de l'aide de quelque chose comme JSONP, ou un proxy solution, vous ne devriez pas être en mesure de faire une base de jquery $.post() à un autre domaine
Mon code de test ressemble à quelque chose comme ceci (en cours d'exécution sur "http://myTestdomain.tld/path/file.html")
var myData = {datum1 : "datum", datum2: "datum"}
$.post("http://External-Ip:port", myData,function(return){alert(return);});
Quand j'ai essayé ceci (la raison pour laquelle j'ai commencé à regarder), chrome-console m'a dit:
XMLHttpRequest ne peut pas charger
http://External-IP:port/page.php. Origine
http://myTestdomain.tld n'est pas autorisé
par Access-Control-Allow-Origin.
Maintenant, c'est, autant que je peux dire, attendu. Je ne devrais pas être capable de faire cela. Le problème c'est que le POSTE NE fait venir auge. J'ai un simple script qui enregistre les $_POST
à un fichier, et il est clair que le poste devient creux. Les données réelles je retour n'est pas livré à mon script d'appel, qui semble de nouveau prévu en raison de l'Accès de problème de contrôle. Mais le fait que le poste est effectivement arrivé sur le serveur m'a confus.
- Est-il exact que je suppose que le code ci-dessus en cours d'exécution sur "myTestdomain" ne devrait pas être en mesure de faire un simple
$.post()
à l'autre domaine Externe (IP)? - Est-il attendu que la demande serait en fait arriver à l'extérieur-ip du script, même si la sortie n'est pas reçu? ou est-ce un bug. (Je suis en utilisant google Chrome 11.0.696.60 )
Je rétracte mon commentaire comme par Michiels réponse, il fait réellement sens de la sécurité.
vous pouvez essayer ce CHROME EXTENSION
OriginalL'auteur Nanne | 2011-05-09
Vous devez vous connecter pour publier un commentaire.
J'ai posté un billet à ce sujet sur le WebKit bugtracker plus tôt, car j'ai pensé que c'était bizarre de comportement et, éventuellement, d'un risque de sécurité.
Depuis liés à la sécurité, les billets ne sont pas visible publiquement, je vais citer la réponse de Justin Schuh ici:
Donc: vous êtes autorisé à faire de la POSTE, car vous pourriez avoir fait que de toute façon par l'incorporation d'un formulaire et de déclencher le bouton soumettre avec le javascript, mais vous ne pouvez pas voir le résultat. Parce que vous ne seriez pas en mesure de le faire dans le formulaire de scénario.
Une solution serait d'ajouter un en-tête du script en cours d'exécution sur le serveur cible, par exemple
Ne l'ai pas testé, mais d'après les specs, cela devrait fonctionner.
Firefox 3.6 semble gérer différemment, par abord faire une OPTIONS pour voir si oui ou non il peut faire le même POST. Firefox 4 fait la même chose Chrome, ou au moins il l'a fait dans mon expérience rapide. De plus, c'est sur https://developer.mozilla.org/en/http_access_control
J'ai essayé plus tôt avec FF 3.6, qui ne m'a pas laissé le faire (il a les OPTIONS à la place). Seulement maintenant, j'ai essayé avec FF 4.0 permet de la demande (de la même manière que google Chrome/Safari, sans vous permettant de voir le résultat).
La demande d'OPTIONS que vous voyez est à cause de contrôle en amont - si vous faites une requête POST avec des en-têtes personnalisés ou un type de contenu défini à quelque chose d'autre que
application/x-www-form-urlencoded, multipart/form-data
, outext/plain
, le navigateur tente de s'assurer qu'une demande à ces en-têtes seront autorisés en faisant une demande d'OPTIONS avant de faire le POST réelle demande.OriginalL'auteur Marlies
La chose importante à noter à propos de JavaScript de même la politique de l'origine restriction est que c'est quelque chose de construit dans les navigateurs modernes pour plus de sécurité - il n'est pas une limitation de la technologie ou quelque chose appliquées par les serveurs.
Pour répondre à votre question, aucun de ces bugs.
Demandes ne sont pas cessé d'atteindre le serveur - le serveur l'option pour permettre à ces requêtes inter-domaine en définissant les en-têtes appropriés1.
La réponse est également reçu par le navigateur. Avant l'utilisation du contrôle d'accès des en-têtes 1, les réponses à des requêtes inter-domaine pourrait être arrêté morts dans leurs voies par un conscientes de la sécurité du navigateur le navigateur de recevoir la réponse, mais il ne serait pas remettre pour le script. Avec le contrôle d'accès des en-têtes, le serveur a la possibilité de définir les en-têtes appropriés indiquant à un navigateur conforme à la norme qu'elle souhaite permettre à certains de l'origine des Url pour faire des croix domaine de demandes de.
Exactement le comportement sur la réponse peut différer entre les navigateurs - je ne me souviens pas, c'est sûr, mais je pense que Chrome appelle la
success
fonction de rappel lors de l'utilisation de jQueryajax()
mais la réponse est vide. IIRC, Firefox va pas invoquer lesuccess
fonction.Votre JavaScript est autorisé à s'exécuter et d'en faire la demande - la demande doit passer par le serveur, mais votre JS peuvent ou peuvent ne pas recevoir la réponse. Si le serveur définit l'en-tête permettant de domaine (l'origine) pour faire de la croix-demande de domaine, un navigateur plus récent qui prend en charge le contrôle d'accès en-tête de laisser la réponse à votre JS. Si c'est un navigateur qui ne comprennent pas ce mécanisme de permettre CDR ou si le serveur ne prend pas la tête qui à l'origine, votre JS ne sera pas obtenir une réponse. Est-ce que c'préciser?
OriginalL'auteur no.good.at.coding
J'obtiens la même chose se passe pour moi. Vous êtes en mesure d'afficher l'ensemble des domaines, mais ne sont pas en mesure de recevoir une réponse. C'est ce que je m'attendais à être en mesure de faire et ce qui se passe pour moi dans Firefox, Chrome et IE.
Un moyen de contourner cette mise en garde est d'avoir un local fichier php avec la volonté d'appel de données par le biais de l'enroulement et de répondre la réponse à votre javascript. (Genre de retraités ce que vous avez dit que vous saviez déjà.)
J'ai utilisé cette capacité à envoyer des données telles qu'un lien vers un autre système. Ce lien est utilisé pour télécharger le fichier vers un serveur distinct, mais ne nécessite pas de réponse pour le script. L'étrange chose que j'ai remarqué, c'est que les en-têtes qui sont retournés ont la bonne longueur du contenu, mais il vient de bandes de données. Je m'attends à le bloquer tous ensemble, donc je n'ai même pas voir l'en-tête de réponse.
yep, c'est exactement ce que je vois. Ne vous attendez pas bien 🙂
OriginalL'auteur Ryan Matthews
Oui, c'est exact, et vous ne serez pas en mesure de le faire, sauf si vous utilisez un proxy.
Pas, demande de ne pas aller à l'adresse IP externe dès qu'il y a une telle limitation.
Eh bien, cela signifie que le point 2 est un bug, parce que je peux confirmer qu'il arrive à la propriété intellectuelle.
Vous avez tort sur le #2, puisque c'est autorisé, sinon des solutions telles que le contrôle d'accès des en-têtes (en lien dans ma réponse) ne fonctionnerait pas. Croix les restrictions de domaine sont "artificielles" dans le sens qu'elles ont été ajoutées aux navigateurs comme une mesure de sécurité et non pas en raison d'une incapacité intrinsèque à faire de telles demandes. En tant que tel, les demandes et les réponses apparaissent sur le fil, c'est juste votre code JS qui ne verra pas la réponse, car le navigateur ne l'arrêtera.
Ah my bad alors. J'ai utilisé le bon sens.
OriginalL'auteur Neutralizer