La document.domain
méthode
- Type de méthode: iframe .
Notez 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:
document.domain = "company.com";
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 mettre document.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
ou POST
sans en-têtes personnalisés et dont le corps est text/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:
Origin: http://www.stackoverflow.com
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:
Access-Control-Allow-Origin: http://www.stackoverflow.com
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:
function createCORSRequest(method, url){
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr){
xhr.open(method, url, true);
} else if (typeof XDomainRequest != "undefined"){
xhr = new XDomainRequest();
xhr.open(method, url);
} else {
xhr = null;
}
return xhr;
}
var request = createCORSRequest("get", "http://www.stackoverflow.com/");
if (request){
request.onload = function() {
// ...
};
request.onreadystatechange = handler;
request.send();
}
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éthode
- Type de méthode: iframe .
window.postMessage
, lorsqu'il est appelé, provoque MessageEvent
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'il window.postMessage
est appelé à partir d'un gestionnaire d'événements, les délais d'attente précédemment définis, etc.). Le MessageEvent
a le type message, une data
propriété qui est définie sur la valeur de chaîne du premier argument fourni à window.postMessage
, une origin
propriété correspondant à l'origine du document principal dans la fenêtre appelant window.postMessage
au moment de l' window.postMessage
appel, et une source
propriété qui est la fenêtre de qui window.postMessage
est appelé.
Pour l'utiliser window.postMessage
, un écouteur d'événement doit être attaché:
// Internet Explorer
window.attachEvent('onmessage',receiveMessage);
// Opera/Mozilla/Webkit
window.addEventListener("message", receiveMessage, false);
Et une receiveMessage
fonction doit être déclarée:
function receiveMessage(event)
{
// do something with event.data;
}
L'iframe hors site doit également envoyer correctement les événements via postMessage
:
<script>window.parent.postMessage('foo','*')</script>
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 les source
propriétés permet des attaques de script intersite.
Source: https://developer.mozilla.org/en/DOM/window.postMessage