Die gleiche Ursprungspolitik
Ich wollte ein Community-Wiki zu HTML / JS -Richtlinien gleichen Ursprungs erstellen, um hoffentlich allen zu helfen, die nach diesem Thema suchen. Dies ist eines der am meisten gesuchten Themen auf SO und es gibt kein konsolidiertes Wiki dafür, also los geht's :)
Dieselbe Ursprungsrichtlinie verhindert, dass ein von einem Ursprung geladenes Dokument oder Skript Eigenschaften eines Dokuments von einem anderen Ursprung abruft oder festlegt. Diese Richtlinie stammt aus Netscape Navigator 2.0.
Was sind einige Ihrer bevorzugten Methoden, um Richtlinien mit demselben Ursprung zu umgehen?
Bitte halten Sie Beispiele ausführlich und verknüpfen Sie vorzugsweise auch Ihre Quellen.
javascript
ajax
same-origin-policy
David Titarenco
quelle
quelle
not constructive
Tag völlig verrückt erscheint. Für die Wiedereröffnung gestimmt.Antworten:
Die
document.domain
MethodeBeachten 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 Ursprungsprüfungen verwendet. Angenommen, ein Skript im Dokument bei
http://store.company.com/dir/other.html
führt die folgende Anweisung aus:Nachdem diese Anweisung ausgeführt wurde, besteht die Seite die Ursprungsprüfung mit
http://company.com/dir/page.html
. Doch durch die gleiche Argumentation, company.com konnte nicht gesetztdocument.domain
zuothercompany.com
.Mit dieser Methode können Sie Javascript von einem Iframe ausführen, der in einer Subdomain auf einer Seite in der Hauptdomain gespeichert ist. Diese Methode eignet sich nicht für domänenübergreifende Ressourcen, da Sie in Browsern wie Firefox keine Änderungen vornehmen können
document.domain
in eine völlig fremde Domain .Quelle: https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript
Die Methode zur gemeinsamen Nutzung von Ressourcen zwischen verschiedenen Ursprüngen
Cross-Origin Resource Sharing (CORS) ist ein W3C-Arbeitsentwurf, der definiert, wie Browser und Server beim Zugriff auf Quellen über Ursprünge hinweg kommunizieren müssen. Die Grundidee von CORS besteht darin, benutzerdefinierte HTTP-Header zu verwenden, damit sowohl der Browser als auch der Server genug voneinander wissen, um festzustellen, ob die Anforderung oder Antwort erfolgreich sein oder fehlschlagen sollte.
Für eine einfache Anfrage, die entweder
GET
oderPOST
ohne benutzerdefinierte Header verwendet und deren Hauptteil isttext/plain
, wird die Anfrage mit einem zusätzlichen Header namens aufgerufenOrigin
. Der Origin-Header enthält den Ursprung (Protokoll, Domänenname und Port) der anfordernden Seite, sodass der Server leicht bestimmen kann, ob eine Antwort bereitgestellt werden soll oder nicht. Ein BeispielheaderOrigin
könnte folgendermaßen aussehen:Wenn der Server entscheidet, dass die Anforderung zulässig sein soll, sendet er einen
Access-Control-Allow-Origin
Header, der denselben Ursprung wiedergibt, der gesendet wurde, oder*
wenn es sich um eine öffentliche Ressource handelt. Beispielsweise:Wenn dieser Header fehlt oder die Ursprünge nicht übereinstimmen, lässt der Browser die Anforderung nicht zu. Wenn alles in Ordnung ist, verarbeitet der Browser die Anfrage. Beachten Sie, dass weder die Anfragen noch die Antworten Cookie-Informationen enthalten.
Das Mozilla-Team schlägt in seinem Beitrag zu CORS vor , das Vorhandensein der
withCredentials
Eigenschaft zu überprüfen, um festzustellen, ob der Browser CORS über XHR unterstützt. Sie können dann mit der Existenz desXDomainRequest
Objekts koppeln , um alle Browser abzudecken:Beachten Sie, dass Sie für die Funktion der CORS-Methode Zugriff auf alle Arten von Server-Header-Mechanismen haben müssen 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
window.postMessage
Methodewindow.postMessage
Wenn ein Aufruf ausgeführt wird, wird aMessageEvent
im Zielfenster ausgelöst, wenn ein ausstehendes Skript abgeschlossen ist, das ausgeführt werden muss (z. B. verbleibende Ereignishandler, wennwindow.postMessage
sie von einem Ereignishandler aufgerufen werden, zuvor festgelegte ausstehende Zeitüberschreitungen usw.). DasMessageEvent
hat die Typnachricht, einedata
Eigenschaft, die auf den Zeichenfolgenwert des ersten bereitgestellten Arguments festgelegt istwindow.postMessage
, eineorigin
Eigenschaft, die dem Ursprung des Hauptdokuments in dem Fenster entspricht,window.postMessage
das zum Zeitpunkt des Aufrufswindow.postMessage
aufgerufen wurde, und einesource
Eigenschaft, aus der das Fenster stammt welcheswindow.postMessage
heißt.Zur Verwendung
window.postMessage
muss ein Ereignis-Listener angehängt sein:Und eine
receiveMessage
Funktion muss deklariert werden:Der externe Iframe muss außerdem Ereignisse ordnungsgemäß senden über
postMessage
:Jedes Fenster kann jederzeit auf diese Methode in jedem anderen Fenster zugreifen, unabhängig vom Speicherort des Dokuments im Fenster, 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 origin und möglicherweise source überprüfen. Dies kann nicht unterschätzt werden: Wenn die Eigenschaften und möglicherweise nicht überprüft werden, werden standortübergreifende Skriptangriffe aktiviert.
origin
source
Quelle: https://developer.mozilla.org/en/DOM/window.postMessage
quelle
Access-Control-Allow-Origin: http://www.stackoverflow.com/
anstelle von:Access-Control-Allow-Origin: http://www.stackoverflow.com
(Schrägstrich am Ende der URL) funktioniert es nicht in Safari und FF, sondern in Chrome. Natürlich funktioniert ohne Schrägstrich in allen Browsern einwandfrei.postMessage
Methode nur für Browser funktioniert, die sie unterstützen, da es sich um eine HTML5-Ergänzung handelt. Dieses Plugin versucht dies zu berücksichtigen. Ich erwähne es nur, weil ich das auf die harte Tour lerne.Die Reverse-Proxy-Methode
Durch das Einrichten eines einfachen Reverse-Proxys 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.
Wenn Sie mod_proxy in Apache verwenden, lautet die grundlegende Konfigurationsanweisung zum Einrichten eines Reverse-Proxys die
ProxyPass
. Es wird normalerweise wie folgt verwendet:In diesem Fall kann der Browser
/ajax/web_service.xml
eine relative URL anfordern , der Server fungiert jedoch als Proxy fürhttp://other-domain.com/ajax/web_service.xml
.Ein interessantes Merkmal dieser Methode ist, dass der Reverse-Proxy Anforderungen problemlos auf mehrere Back-Ends verteilen kann und somit als Load Balancer fungiert .
quelle
Ich benutze JSONP.
Grundsätzlich fügen Sie hinzu
Auf deiner Seite.
some_func () sollte aufgerufen werden, damit Sie benachrichtigt werden, dass sich die Daten in befinden.
quelle
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 .
quelle
Die jüngste Methode zur Überwindung der Richtlinie mit demselben Ursprung, die ich gefunden habe, ist http://anyorigin.com/.
Die Site wurde so erstellt, dass Sie ihr nur eine URL geben und Javascript / JQuery-Code für Sie generieren, mit dem Sie 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:
quelle
Ich kann dieses Bild nicht gutschreiben, aber es passt zu allem, was ich zu diesem Thema weiß, und bietet gleichzeitig ein bisschen Humor.
http://www.flickr.com/photos/iluvrhinestones/5889370258/
quelle
Das JSONP fällt mir ein:
quelle
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 für XSS-Angriffe offen lassen, aber dies ist ein vernünftiger Kompromiss.Es gibt auch mehrere Plugins für die beliebten Javascript-Toolkits
window.postMessage
, die ähnliche Funktionen wie ältere Browser mit den anderen oben beschriebenen Methoden bieten.quelle
Nun, ich habe Curl in PHP verwendet, um dies zu umgehen. Ich habe einen Webservice in Port 82.
Hier ist das Javascript, mit dem die PHP-Datei aufgerufen wird
Mein HTML läuft auf WAMP in Port 80. Also los geht's, die gleiche Ursprungsrichtlinie wurde umgangen :-)
quelle
Hier sind einige Problemumgehungen und Erläuterungen zur Richtlinie für denselben Ursprung:
Thirus Blog - Problemumgehung für Richtlinien für denselben Ursprung im Browser
quelle
Diese analysieren ziemlich genau, was da draußen verfügbar ist: http://www.slideshare.net/SlexAxton/breaking-the-cross-domain-barrier
Informationen zur postMessage-Lösung finden Sie unter:
https://github.com/chrissrogers/jquery-postmessage/blob/master/jquery.ba-postmessage.js
und eine etwas andere Version:
https://github.com/thomassturm/ender-postmessage/blob/master/ender-postmessage.js
quelle