150 votes

Moyens de contourner la politique de l'origine identique (same-origin)

La même politique d'origine

Je voulais créer un wiki communautaire concernant HTML/JS politiques d'origine commune afin d'aider, je l'espère, toute personne cherchant ce sujet. C'est l'un des sujets les plus recherchés sur l'OS et il n'y a pas de wiki consolidé pour ce sujet, alors j'y vais :)

La même politique d'origine empêche un document ou script chargé depuis une origine d'obtenir ou de définir les propriétés d'un document provenant d'une autre origine origine. Cette politique remonte jusqu'à Netscape Navigator 2.0.

Quelles sont vos méthodes préférées pour contourner les politiques d'origine identique ?

Veillez à ce que les exemples soient verbeux et, de préférence, indiquez également vos sources.

84voto

David Titarenco Points 17148

El 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 à un suffixe du domaine actuel. Si elle le fait, 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";

Après l'exécution de cette déclaration, la page passe la vérification de l'origine avec http://company.com/dir/page.html . Cependant, par le même raisonnement, company.com ne pourrait pas fixer document.domain à othercompany.com .

Avec cette méthode, vous seriez autorisé à extraire le javascript d'un iframe situé dans un sous-domaine sur une page située dans le domaine principal. Cette méthode n'est pas adaptée aux ressources inter-domaines, car les navigateurs comme Firefox ne vous permettront pas de modifier l'adresse de l'utilisateur. document.domain à un domaine complètement étranger.

Source : https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript

La méthode de partage des ressources inter-origines

  • Type de méthode : AJAX .

Partage de ressources inter-origine (CORS) est un projet de travail du W3C qui définit la manière dont le navigateur et le serveur doivent communiquer lors de l'accès à des sources d'origines différentes. L'idée de base de CORS est d'utiliser des en-têtes HTTP personnalisés pour permettre au navigateur et au serveur d'en savoir suffisamment l'un sur l'autre pour déterminer si la demande ou la réponse doit aboutir ou non.

Pour une demande simple, qui utilise soit GET o POST sans en-tête personnalisé et dont le corps est text/plain la demande 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 requérante afin que le serveur puisse facilement déterminer s'il doit ou non servir une réponse. Un exemple Origin L'en-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 message Access-Control-Allow-Origin renvoyant la même origine que celle qui a été envoyée ou * si c'est 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 rejette 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 de Mozilla suggère dans leur billet sur CORS que vous devez vérifier l'existence de la withCredentials pour déterminer si le navigateur prend en charge CORS via XHR. Vous pouvez alors coupler avec l'existence de la propriété XDomainRequest 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 à tout 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/

El window.postMessage méthode

  • Type de méthode : iframe .

window.postMessage lorsqu'il est appelé, provoque un MessageEvent à envoyer à la fenêtre cible lorsque tout script en suspens qui doit être exécuté se termine (par exemple, les gestionnaires d'événements restants si window.postMessage est appelé depuis un gestionnaire d'événements, les délais d'attente définis précédemment, etc.) Le site MessageEvent a le type message, un data qui est définie comme la valeur de la chaîne de caractères du premier argument fourni à l'utilisateur. window.postMessage , un origin correspondant à l'origine du document principal dans la fenêtre appelante. window.postMessage à l'époque window.postMessage a été appelé, et un source qui est la fenêtre à partir de laquelle window.postMessage s'appelle.

Pour utiliser window.postMessage un écouteur d'événements doit être attaché :

    // Internet Explorer
    window.attachEvent('onmessage',receiveMessage);

    // Opera/Mozilla/Webkit
    window.addEventListener("message", receiveMessage, false);

Et un receiveMessage 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 toute autre fenêtre, à tout moment, indépendamment de l'emplacement du document dans la fenêtre, pour lui envoyer un message. Par conséquent, tout auditeur d'événements utilisé pour recevoir des messages doit d'abord vérifier l'identité de l'expéditeur du message, en utilisant les propriétés d'origine et éventuellement de source. On ne saurait trop insister sur ce point : Le fait de ne pas vérifier le origin et éventuellement source permet des attaques de type "cross-site scripting".

Source : https://developer.mozilla.org/en/DOM/window.postMessage

41voto

Daniel Vassallo Points 142049

La méthode Reverse Proxy

  • Type de méthode : Ajax

Mise en place d'un simple reverse proxy sur le serveur, permettra au navigateur d'utiliser des chemins relatifs pour les requêtes Ajax, tandis que le serveur agira comme un proxy pour tout emplacement distant.

Si vous utilisez mod_proxy dans Apache, la directive de configuration fondamentale pour mettre en place un reverse proxy est la directive ProxyPass . Il est généralement utilisé comme suit :

ProxyPass     /ajax/     http://other-domain.com/ajax/

Dans ce cas, le navigateur serait en mesure de demander /ajax/web_service.xml comme une URL relative, mais le serveur s'en chargerait en agissant comme un proxy vers http://other-domain.com/ajax/web_service.xml .

Une caractéristique intéressante de cette méthode est que le proxy inverse peut facilement distribuer les demandes vers plusieurs back-ends, agissant ainsi comme un équilibreur de charge .

17voto

Nicolas Viennot Points 1935

J'utilise JSONP.

En gros, vous ajoutez

<script src="http://..../someData.js?callback=some_func"/>

sur votre page.

some_func() doit être appelé pour que vous soyez informé que les données sont entrées.

13voto

ripper234 Points 39314

AnyOrigin ne fonctionnait pas bien avec certains sites https, j'ai donc écrit une alternative open source appelée whateverorigin.org qui semble bien fonctionner avec https.

Code sur github .

12voto

rk1s Points 13

Le moyen le plus récent de contourner la politique d'origine identique que j'ai trouvé est le suivant http://anyorigin.com/

Le site est conçu de manière à ce que vous lui donniez n'importe quelle URL et qu'il génère du code javascript/jquery pour vous permettre d'obtenir le html/données, quelle que soit son origine. En d'autres termes, il fait de n'importe quelle url ou page web une requête JSONP.

Je l'ai trouvé assez utile :)

Voici un exemple de code javascript de anyorigin :

$.getJSON('http://anyorigin.com/get?url=google.com&callback=?', function(data){
    $('#output').html(data.contents);
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X