Moyens de contourner la Politique de la même origine

la même politique d'origine

j'ai voulu faire un wiki de communauté concernant HTML/JS politiques de même origine pour aider avec un peu de chance n'importe qui cherchant 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 donc je vais:)

la même politique d'origine empêche une document ou script chargé à partir d'un l'origine de l'obtention ou de réglage les propriétés d'un document à partir d'un autre origine. Cette politique Date de tout le chemin retour à Netscape Navigator 2.0.

quelles sont vos méthodes préférées pour contourner les politiques de même origine?

s'il vous Plaît garder exemples détaillé et de préférence aussi le lien de vos sources.

150
demandé sur David Titarenco 2010-06-19 21:01:29

11 réponses

Le document.domain méthode

  • Type de méthode: iframe .

notez qu'il s'agit d'une méthode iframe qui fixe la valeur du document.domaine vers un suffixe du domaine courant. Si c'est le cas, le domaine 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 la déclaration suivante:

document.domain = "company.com";

Après que cette déclaration s'exécute, la page passe la vérification de l'origine avec http://company.com/dir/page.html . Toutefois, selon le même raisonnement, company.com ne pouvait pas mettre document.domain à othercompany.com .

avec cette méthode, vous seriez autorisé à exécuter 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 pour les ressources inter-domaines car les navigateurs comme Firefox ne vous permettront pas de changer le document.domain en un complètement étranger domaine.

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

Le Cross-Origin Resource sharing méthode

  • type de Méthode: AJAX .

Cross-Origin Resource Sharing (CORS) est un projet de travail du W3C qui définit comment le navigateur et le serveur doivent communiquer lorsque accès aux sources à travers les origines. L'idée de base derrière CORS est d'utiliser des en-têtes HTTP personnalisés pour permettre à la fois au navigateur et au serveur d'en savoir assez sur l'autre pour déterminer si la requête ou la réponse devrait réussir ou échouer.

pour une requête simple, qui utilise soit GET ou POST sans en-tête personnalisé 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 requérante afin que le serveur puisse facilement déterminer s'il doit ou non servir une réponse. Un exemple Origin en-tête pourrait ressembler à ceci:

Origin: http://www.stackoverflow.com

si le serveur décide que la requête doit être autorisée, il envoie un en-tête Access-Control-Allow-Origin faisant écho à la même origine que celle 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 les origines ne correspondent pas, alors le navigateur rejette la demande. Si tout va bien, puis le navigateur traite la demande. Veuillez noter que ni les demandes ni les réponses ne contiennent de renseignements sur les témoins.

l'équipe de Mozilla suggère dans leur post sur CORS que vous devriez vérifier l'existence de la propriété withCredentials pour déterminer si le navigateur supporte CORS via XHR. Vous pouvez alors couple avec l'existence du XDomainRequest objet pour 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écanique d'en-tête de serveur et ne pouvez pas simplement accéder à n'importe quelle ressource tierce.

Source: http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing /

Le window.postMessage méthode

  • Type de méthode: iframe .

window.postMessage , lorsqu'il est appelé, fait qu'un MessageEvent est envoyé à la fenêtre cible lorsque n'importe quel script en attente qui doit être exécuté est terminé (par exemple les gestionnaires d'événements restants si window.postMessage est appelé à partir d'un gestionnaire d'événements, précédemment-défini temps d'attente, etc.). Le MessageEvent a le message de type, une propriété data qui est réglée à la valeur de chaîne du premier argument fourni à window.postMessage , un origin propriété correspondant à l'origine du document principal dans la fenêtre appelant window.postMessage à l'époque window.postMessage a été appelé, et une source propriété qui est la fenêtre à partir de laquelle window.postMessage est appelé.

utiliser window.postMessage , un écouteur d'événement doivent être joints:

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

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

et une fonction receiveMessage doivent être déclarées:

function receiveMessage(event)
{
    // do something with event.data;
}

l'iframe hors site doit également envoyer événements correctement via postMessage :

<script>window.parent.postMessage('foo','*')</script>

une fenêtre peut accéder à cette méthode sur n'importe quelle autre fenêtre, à tout moment, indépendamment de l'emplacement du document dans la fenêtre, afin d'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. Cela ne peut pas être sous-estimé: défaut de vérifier le origin et peut-être Les propriétés source permettent des attaques de scripts sur plusieurs sites.

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

84
répondu David Titarenco 2011-10-06 21:12:14

Le Proxy Inverse de la méthode

  • Type de méthode: Ajax

configurer un simple reverse proxy sur le serveur, permettra au navigateur d'utiliser des chemins relatifs pour les requêtes Ajax, tandis que le serveur agirait comme un proxy à n'importe quel endroit éloigné.

si vous utilisez mod_proxy dans Apache, le la directive de configuration fondamentale pour configurer un mandataire inverse est la 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 servirait cela en agissant comme un proxy à 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 des requêtes vers plusieurs back-ends, agissant ainsi comme un load balancer .

41
répondu Daniel Vassallo 2010-06-20 04:12:41

j'utilise JSONP.

en gros, vous ajoutez

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

sur votre page.

some_func () devrait être appelé de sorte que vous soyez informé que les données sont entrées.

17
répondu Nicolas Viennot 2010-06-19 17:09:09

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

Code sur github .

13
répondu ripper234 2011-10-27 00:45:00

la façon la plus récente de surmonter la Politique de la même origine que j'ai trouvé est http://anyorigin.com /

le site est fait de sorte que vous lui donnez n'importe quelle url et il génère le code javascript/jquery pour vous qui vous permet d'obtenir le html/données, quelle que soit son origine. En d'autres termes, il rend n'importe quelle url ou page Web une requête JSONP.

Je l'ai trouvé assez utile:)

voici un exemple code javascript de anyorigin:

$.getJSON('http://anyorigin.com/get?url=google.com&callback=?', function(data){
    $('#output').html(data.contents);
});
12
répondu rk1s 2011-05-24 00:13:50

Je ne peux pas revendiquer le crédit pour 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 /

12
répondu Mat Schaffer 2011-11-14 02:50:31

le JSONP vient à l'esprit:

JSONP ou "JSON avec un rembourrage" est un complément à la base de données JSON format, un modèle d'utilisation qui permet page à demander et de manière plus significative utiliser JSON à partir d'un serveur autre que le serveur primaire. JSONP est un alternative à une méthode plus récente appelé partage des ressources entre les différentes origines.

3
répondu Sarfraz 2010-06-19 19:07:37

Personnellement, window.postMessage est le moyen le plus fiable que j'ai trouvé pour les navigateurs modernes. Vous devez faire un peu plus de travail pour être sûr de ne pas vous laisser vous-même ouvert aux attaques XSS, mais c'est un compromis raisonnable.

il y a aussi plusieurs plugins pour les populaires boîtes à outils Javascript dehors là qui enveloppent window.postMessage qui fournissent des fonctionnalités similaires aux navigateurs plus anciens en utilisant les autres méthodes discutées ci-dessus.

1
répondu Justin Niessner 2010-06-19 17:06:01

Eh bien, j'ai utilisé curl en PHP pour contourner cela. J'ai un service Web au port 82.

<?php

$curl = curl_init();
$timeout = 30;
$ret = "";
$url="http://localhost:82/put_val?val=".$_GET["val"];
curl_setopt ($curl, CURLOPT_URL, $url);
curl_setopt ($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($curl, CURLOPT_MAXREDIRS, 20);
curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5");
curl_setopt ($curl, CURLOPT_CONNECTTIMEOUT, $timeout);
$text = curl_exec($curl);
echo $text;

?>

voici le javascript qui fait l'appel au fichier PHP

function getdata(obj1, obj2) {

    var xmlhttp;

    if (window.XMLHttpRequest)
            xmlhttp=new XMLHttpRequest();
    else
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
                document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
        }
    }
    xmlhttp.open("GET","phpURLFile.php?eqp="+obj1+"&val="+obj2,true);
    xmlhttp.send();
}

mon HTML tourne sur WAMP dans le port 80. Nous y voilà, la même politique d'origine a été contournée: -)

1
répondu harihb 2011-04-12 09:05:50

voici quelques solutions de rechange et explication de la même-origine-Politique:

Thiru's Blog-Browser same origin policy workaround

1
répondu user1094140 2011-12-12 16:57:32
1
répondu Chris Cinelli 2012-04-19 23:56:22