La même politique d'origine
Je voulais créer un wiki communautaire concernant les politiques HTML / JS de même origine pour aider, espérons-le, tous ceux qui recherchent ce sujet. C'est l'un des sujets les plus recherchés sur SO et il n'y a pas de wiki consolidé pour cela, alors j'y vais :)
La même politique d'origine empêche un document ou un script chargé à partir d'une origine d'obtenir ou de définir les propriétés d'un document à partir d'une autre origine. Cette politique remonte à Netscape Navigator 2.0.
Quelles sont certaines de vos façons préférées de contourner les politiques de même origine?
Veuillez garder des exemples verbeux et de préférence également relier vos sources.
javascript
ajax
same-origin-policy
David Titarenco
la source
la source
not constructive
balise semble tout à fait absurde. A voté pour la réouverture.Réponses:
La
document.domain
méthodeNotez qu'il s'agit d'une méthode iframe qui définit la valeur de document.domain sur un suffixe du domaine actuel. Si tel est le cas, le domaine le plus court est utilisé pour les contrôles d'origine ultérieurs. Par exemple, supposons qu'un script dans le document à
http://store.company.com/dir/other.html
exécute l'instruction suivante:Une fois cette instruction exécutée, la page passera la vérification d'origine avec
http://company.com/dir/page.html
. Cependant, par le même raisonnement, company.com ne pouvait pas mettredocument.domain
àothercompany.com
.Avec cette méthode, vous seriez autorisé à exécuter du javascript à partir d'une iframe provenant d'un sous-domaine sur une page provenant du domaine principal. Cette méthode n'est pas adaptée aux ressources inter-domaines car les navigateurs comme Firefox ne vous permettront pas de changer le
document.domain
en un domaine complètement étranger.Source: https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript
La méthode de partage de ressources cross-origin
Cross-Origin Resource Sharing (CORS) est une ébauche de travail du W3C qui définit la manière dont le navigateur et le serveur doivent communiquer lors de l'accès aux sources entre les origines. L'idée de base derrière CORS est d'utiliser des en-têtes HTTP personnalisés pour permettre au navigateur et au serveur de se connaître suffisamment pour déterminer si la demande ou la réponse doit réussir ou échouer.
Pour une requête simple, qui utilise soit
GET
ouPOST
sans en-têtes personnalisés et dont le corps esttext/plain
, la requête est envoyée avec un en-tête supplémentaire appeléOrigin
. L'en-tête Origin contient l'origine (protocole, nom de domaine et port) de la page demandeuse afin que le serveur puisse facilement déterminer s'il doit ou non servir une réponse. Un exemple d'en-Origin
tête pourrait ressembler à ceci:Si le serveur décide que la demande doit être autorisée, il envoie un en-
Access-Control-Allow-Origin
tête faisant écho à la même origine qui a été envoyée ou*
s'il s'agit d'une ressource publique. Par exemple:Si cet en-tête est manquant ou si les origines ne correspondent pas, le navigateur refuse la demande. Si tout va bien, le navigateur traite la demande. Notez que ni les demandes ni les réponses ne contiennent d'informations sur les cookies.
L'équipe Mozilla suggère dans son article sur CORS que vous devriez vérifier l'existence de la
withCredentials
propriété pour déterminer si le navigateur prend en charge CORS via XHR. Vous pouvez alors coupler avec l'existence de l'XDomainRequest
objet pour couvrir tous les navigateurs:Notez que pour que la méthode CORS fonctionne, vous devez avoir accès à n'importe quel type de mécanisme d'en-tête de serveur et ne pouvez pas simplement accéder à une ressource tierce.
Source: http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/
La
window.postMessage
méthodewindow.postMessage
, lorsqu'il est appelé, provoqueMessageEvent
l'envoi de a à la fenêtre cible lorsqu'un script en attente qui doit être exécuté se termine (par exemple, les gestionnaires d'événements restants s'ilwindow.postMessage
est appelé à partir d'un gestionnaire d'événements, les délais d'attente précédemment définis, etc.). LeMessageEvent
a le type message, unedata
propriété qui est définie sur la valeur de chaîne du premier argument fourni àwindow.postMessage
, uneorigin
propriété correspondant à l'origine du document principal dans la fenêtre appelantwindow.postMessage
au moment de l'window.postMessage
appel, et unesource
propriété qui est la fenêtre de quiwindow.postMessage
est appelé.Pour l'utiliser
window.postMessage
, un écouteur d'événement doit être attaché:Et une
receiveMessage
fonction doit être déclarée:L'iframe hors site doit également envoyer correctement les événements via
postMessage
:Toute fenêtre peut accéder à cette méthode sur n'importe quelle autre fenêtre, à tout moment, quel que soit l'emplacement du document dans la fenêtre, pour lui envoyer un message. Par conséquent, tout écouteur d'événement utilisé pour recevoir des messages doit d'abord vérifier l'identité de l'expéditeur du message, en utilisant l'origine et éventuellement les propriétés source. Cela ne peut pas être sous- estimé : le fait de ne pas vérifier les propriétés
origin
et éventuellement lessource
propriétés permet des attaques de script intersite.Source: https://developer.mozilla.org/en/DOM/window.postMessage
la source
Access-Control-Allow-Origin: http://www.stackoverflow.com/
au lieu de:Access-Control-Allow-Origin: http://www.stackoverflow.com
(barre oblique à la fin de l'url), cela ne fonctionne pas dans Safari et FF mais fonctionne dans Chrome. Bien sûr, sans barre oblique fonctionne bien dans tous les navigateurs.postMessage
méthode ne fonctionne que pour les navigateurs qui la prennent en charge, car il s'agit d'un ajout HTML5. Ce plugin essaie d'en tenir compte. Je le mentionne simplement parce que j'apprends cela à la dure.La méthode du proxy inverse
La configuration d'un proxy inverse simple sur le serveur permettra au navigateur d'utiliser des chemins relatifs pour les requêtes Ajax, tandis que le serveur agirait en tant que proxy vers n'importe quel emplacement distant.
Si vous utilisez mod_proxy dans Apache, la directive de configuration fondamentale pour configurer un proxy inverse est le
ProxyPass
. Il est généralement utilisé comme suit:Dans ce cas, le navigateur pourrait demander en
/ajax/web_service.xml
tant qu'URL relative, mais le serveur le servirait en agissant en tant que proxy pourhttp://other-domain.com/ajax/web_service.xml
.Une caractéristique intéressante de cette méthode est que le proxy inverse peut facilement distribuer des requêtes vers plusieurs back-ends, agissant ainsi comme un équilibreur de charge .
la source
J'utilise JSONP.
En gros, vous ajoutez
sur ta page.
some_func () devrait être appelé afin que vous soyez averti que les données sont dans.
la source
AnyOrigin ne fonctionnait pas bien avec certains sites https, je viens donc d'écrire une alternative open source appelée whatorigin.org qui semble bien fonctionner avec https.
Code sur github .
la source
Le moyen le plus récent de surmonter la politique de même origine que j'ai trouvé est http://anyorigin.com/
Le site est conçu pour que vous lui donniez n'importe quelle URL et il génère pour vous du code javascript / jquery qui vous permet d'obtenir le html / data, quelle que soit son origine. En d'autres termes, toute URL ou page Web est une requête JSONP.
Je l'ai trouvé assez utile :)
Voici un exemple de code javascript de n'importe quelle origine:
la source
Je ne peux pas revendiquer le mérite de cette image, mais elle correspond à tout ce que je sais sur ce sujet et offre un peu d'humour en même temps.
http://www.flickr.com/photos/iluvrhinestones/5889370258/
la source
Le JSONP vient à l'esprit:
la source
Personnellement,
window.postMessage
c'est le moyen le plus fiable que j'ai trouvé pour les navigateurs modernes. Vous devez faire un peu plus de travail pour vous assurer de ne pas vous exposer aux attaques XSS, mais c'est un compromis raisonnable.Il existe également plusieurs plugins pour les boîtes à outils Javascript populaires
window.postMessage
qui fournissent des fonctionnalités similaires aux navigateurs plus anciens en utilisant les autres méthodes décrites ci-dessus.la source
Eh bien, j'ai utilisé curl en PHP pour contourner cela. J'ai un webservice fonctionnant dans le port 82.
Voici le javascript qui fait l'appel au fichier PHP
Mon HTML fonctionne sur WAMP dans le port 80. Alors voilà, la même politique d'origine a été contournée :-)
la source
Voici quelques solutions de contournement et explications de la même politique d'origine:
Blog de Thiru - Solution de contournement de la même politique d'origine du navigateur
la source
Cette analyse à peu près ce qui est disponible là-bas: http://www.slideshare.net/SlexAxton/breaking-the-cross-domain-barrier
Pour la solution postMessage, jetez un œil à:
https://github.com/chrissrogers/jquery-postmessage/blob/master/jquery.ba-postmessage.js
et une version légèrement différente:
https://github.com/thomassturm/ender-postmessage/blob/master/ender-postmessage.js
la source