it-swarm.com.de

Möglichkeiten zur Umgehung der Richtlinie für denselben Ursprung

Dieselbe Ursprungsrichtlinie

Ich wollte ein Community-Wiki für HTML/JS-Richtlinien mit gleichem Ursprung erstellen, um hoffentlich allen zu helfen, die nach diesem Thema suchen. Dies ist eines der am meisten gesuchten Themen in SO und es gibt kein konsolidiertes Wiki dafür, also los gehts :)

Dieselbe Origin-Richtlinie verhindert, dass ein von einem Origin geladenes Dokument oder Skript Eigenschaften eines Dokuments von einem anderen Origin abruft oder einstellt. Diese Richtlinie reicht bis zu Netscape Navigator 2.0 zurück.

Was sind einige Ihrer bevorzugten Methoden, um Richtlinien mit demselben Ursprung zu umgehen?

Bitte bewahren Sie Beispiele ausführlich auf und verlinken Sie vorzugsweise auch Ihre Quellen.

150
David Titarenco

Die Methode document.domain

  • Methodentyp: iframe .

Beachten Sie, dass dies eine iframe-Methode ist, die den Wert von document.domain auf ein Suffix der aktuellen Domäne setzt. In diesem Fall wird die kürzere Domain für nachfolgende Origin-Prüfungen verwendet. Angenommen, ein Skript im Dokument unter http://store.company.com/dir/other.html Führt die folgende Anweisung aus:

document.domain = "company.com";

Nachdem diese Anweisung ausgeführt wurde, bestand die Seite die Origin-Prüfung mit http://company.com/dir/page.html. Aus demselben Grund konnte company.com jedoch nicht document.domain Auf othercompany.com Setzen.

Mit dieser Methode können Sie Javascript von einem Iframe entfernen, der in einer Unterdomäne auf einer Seite in der Hauptdomäne gespeichert ist. Diese Methode ist nicht für domänenübergreifende Ressourcen geeignet, da Sie mit Browsern wie Firefox den document.domain Nicht in eine vollständig fremde Domain ändern können.

Quelle: https://developer.mozilla.org/en/Same_Origin_policy_for_JavaScript

Die herkunftsübergreifende Methode zur gemeinsamen Nutzung von Ressourcen

  • Methodentyp: [~ # ~] ajax [~ # ~] .

Cross-Origin Resource Sharing (CORS) ist ein W3C Working Draft, der definiert, wie der Browser und der Server beim Zugriff auf Quellen über Herkunftsgrenzen hinweg kommunizieren müssen. Die Grundidee von CORS besteht darin, benutzerdefinierte HTTP-Header zu verwenden, damit sowohl der Browser als auch der Server genügend voneinander wissen, um festzustellen, ob die Anforderung oder Antwort erfolgreich sein oder fehlschlagen sollte.

Bei einer einfachen Anfrage, die entweder GET oder POST ohne benutzerdefinierte Header verwendet und deren Hauptteil text/plain Ist, wird die Anfrage mit einem zusätzlichen Header namens Origin. Der Origin-Header enthält den Ursprung (Protokoll, Domänenname und Port) der anfordernden Seite, sodass der Server leicht bestimmen kann, ob er eine Antwort liefern soll oder nicht. Ein Beispiel-Header für Origin könnte folgendermaßen aussehen:

Origin: http://www.stackoverflow.com

Wenn der Server entscheidet, dass die Anforderung zulässig sein soll, sendet er einen Access-Control-Allow-Origin - Header, der denselben Ursprung wie zuvor wiedergibt, oder *, Wenn es sich um eine öffentliche Ressource handelt. Zum Beispiel:

Access-Control-Allow-Origin: http://www.stackoverflow.com

Wenn dieser Header fehlt oder die Herkunft nicht übereinstimmt, lässt der Browser die Anfrage nicht zu. Wenn alles in Ordnung ist, verarbeitet der Browser die Anfrage. Beachten Sie, dass weder die Anforderungen noch die Antworten Cookie-Informationen enthalten.

Das Mozilla-Team schlägt in ihrem Beitrag über CORS vor, dass Sie prüfen, ob die Eigenschaft withCredentials vorhanden ist, um festzustellen, ob der Browser CORS über XHR unterstützt. Sie können dann mit der Existenz des Objekts XDomainRequest koppeln, um alle Browser abzudecken:

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();
}

Beachten Sie, dass Sie für die CORS-Methode Zugriff auf eine beliebige Art von Server-Header-Mechanik benötigen und nicht einfach auf Ressourcen von Drittanbietern zugreifen können.

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

Die Methode window.postMessage

  • Methodentyp: iframe .

Wenn window.postMessage Aufgerufen wird, wird im Zielfenster ein MessageEvent ausgelöst, wenn ein ausstehendes Skript ausgeführt werden muss (z. B. verbleibende Ereignishandler, wenn window.postMessage Von einem aufgerufen wird) Ereignishandler, zuvor festgelegte ausstehende Zeitüberschreitungen usw.). Das MessageEvent hat den Typ message, eine data -Eigenschaft, die auf den Zeichenfolgenwert des ersten für window.postMessage Bereitgestellten Arguments festgelegt ist, eine Origin -Eigenschaft entsprechend Der Ursprung des Hauptdokuments im Fenster, das zum Zeitpunkt des Aufrufs von window.postMessagewindow.postMessage aufgerufen wurde, und eine Eigenschaft source, die das Fenster ist, aus dem window.postMessage stammt namens.

Um window.postMessage Verwenden zu können, muss ein Ereignis-Listener angehängt sein:

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

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

Und eine receiveMessage -Funktion muss deklariert werden:

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

Der externe iframe muss Ereignisse auch ordnungsgemäß über postMessage senden:

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

Jedes Fenster kann unabhängig von der Position des Dokuments im Fenster jederzeit in jedem anderen Fenster auf diese Methode zugreifen, um ihm eine Nachricht zu senden. Folglich muss jeder Ereignis-Listener, der zum Empfangen von Nachrichten verwendet wird, zuerst die Identität des Absenders der Nachricht unter Verwendung der Eigenschaften Ursprung und möglicherweise Quelle überprüfen. Dies kann nicht unterschätzt werden: Wenn die Eigenschaften Origin und möglicherweise source nicht überprüft werden, werden siteübergreifende Skriptangriffe aktiviert.

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

84
David Titarenco

Die Reverse Proxy-Methode

  • Methodentyp: Ajax

Durch das Einrichten eines einfachen Reverse-Proxy auf dem Server kann der Browser relative Pfade für die Ajax-Anforderungen verwenden, während der Server als Proxy für einen beliebigen Remotestandort fungiert.

Bei Verwendung von mod_proxy in Apache lautet die grundlegende Konfigurationsanweisung zum Einrichten eines Reverse-Proxys ProxyPass. Es wird normalerweise wie folgt verwendet:

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

In diesem Fall kann der Browser /ajax/web_service.xml als relative URL, der Server fungiert jedoch als Proxy für http://other-domain.com/ajax/web_service.xml.

Ein interessantes Merkmal dieser Methode ist, dass der Reverse-Proxy Anforderungen leicht auf mehrere Back-Ends verteilen kann und somit als Load Balancer fungiert.

41
Daniel Vassallo

Ich benutze JSONP.

Grundsätzlich fügst du hinzu

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

auf deiner Seite.

some_func () sollte aufgerufen werden, damit Sie benachrichtigt werden, dass sich die Daten in befinden.

17
Nicolas Viennot

AnyOrigin funktionierte mit einigen https-Sites nicht gut, daher habe ich gerade eine Open-Source-Alternative namens whateverorigin.org geschrieben, die mit https gut zu funktionieren scheint.

Code auf Github .

13
ripper234

Ich kann keine Anerkennung für dieses Bild erheben, aber es passt zu allem, was ich zu diesem Thema weiß, und bietet gleichzeitig ein bisschen Humor.

http://www.flickr.com/photos/iluvrhinestones/5889370258/

12
Mat Schaffer

Die letzte Möglichkeit, die von mir gefundene Richtlinie für denselben Ursprung zu überwinden, ist http://anyorigin.com/

Die Site wurde so erstellt, dass Sie ihr nur eine URL geben und JavaScript/JQuery-Code für Sie generiert, mit dem Sie die HTML/Daten unabhängig von ihrer Herkunft abrufen können. Mit anderen Worten, es macht jede URL oder Webseite zu einer JSONP-Anfrage.

Ich fand es ziemlich nützlich :)

Hier ist ein Beispiel für einen Javascript-Code von anyorigin:

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

Das JSONP fällt mir ein:

JSONP oder "JSON with padding" ist eine Ergänzung zum Basis-JSON-Datenformat, einem Verwendungsmuster, das es einer Seite ermöglicht, JSON von einem anderen Server als dem Primärserver anzufordern und sinnvoller zu verwenden. JSONP ist eine Alternative zu einer neueren Methode namens Cross-Origin Resource Sharing.

3
Sarfraz

Nun, ich habe curl in PHP verwendet, um dies zu umgehen. Ich habe einen Webservice, der in Port 82 ausgeführt wird.

<?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;

?>

Hier ist das Javascript, das die PHP Datei aufruft

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();
}

Mein HTML läuft auf WAMP in Port 80. Also los geht's, die gleiche Origin-Richtlinie wurde umgangen :-)

1
harihb
1
Chris Cinelli

Persönlich, window.postMessage ist der zuverlässigste Weg, den ich für moderne Browser gefunden habe. Sie müssen ein wenig mehr arbeiten, um sicherzustellen, dass Sie sich nicht XSS-Angriffen aussetzen, aber es ist ein vernünftiger Kompromiss.

Es gibt auch verschiedene Plugins für die beliebten Javascript-Toolkits, die window.postMessage, die mit den anderen oben beschriebenen Methoden eine ähnliche Funktionalität wie ältere Browser bieten.

1
Justin Niessner

Hier sind einige Problemumgehungen und Erklärungen zur gleichen Herkunftspolitik:
Problemumgehung für die Richtlinie "Blog - Browser same Origin" von Thir

1
Thiru