Die Webentwicklung erfordert häufig mit Cross-Domänen-Problemen. Die Hauptursache für Cross-Domänen-Probleme ist die gleichorientierte Strategie in der Browsersicherheit. Zum Beispiel für http://www.a.com/1.html:
1. http://www.a.com/2.html ist homolog;
2. https://www.a.com/2.html stammt aus verschiedenen Quellen, weil das Protokoll unterschiedlich ist;
3..
4. http://sub.a.com/2.html stammt aus verschiedenen Quellen, da die Hosts unterschiedlich sind.
Im Browser können die Tags <Script>, <Meeng>, <Iframe> und <Link> Cross-Domain-Ressourcen (nicht-homologe) Ressourcen laden, und die Lademethode entspricht tatsächlich einer gewöhnlichen GET-Anforderung. Der einzige Unterschied besteht darin, dass der Browser aus Sicherheitsgründen nicht auf diese Weise Lesen und Schreiben von Vorgängen auf die geladenen Ressourcen erlaubt, sondern nur die Funktionen, die das Tag selbst haben sollte (z. B. Skriptausführung, Stilanwendung usw.).
Das häufigste Cross-Domänen-Problem ist das Cross-Domain-Zugangsproblem von Ajax. Standardmäßig können Cross-Domänen-URLs nicht über Ajax zugegriffen werden. Hier zeichne ich auf, was ich über Cross-Domain-Methoden gelernt habe:
1. Serverseitiger Proxy , es gibt nichts zu sagen. Der Nachteil ist, dass der Server, der AJAX -Anforderungen empfängt, standardmäßig die IP und die UA des Clients nicht erhalten kann.
2. Iframe , die Verwendung von Iframe ist tatsächlich gleichbedeutend mit der Öffnung einer neuen Webseite. Die spezifische Cross-Domänen-Methode ist ungefähr die übergeordnete übergeordnete Seite, die von Domain A nistet und ein Iframe auf Domäne B zeigt, und legt dann die Daten ein. Nach Abschluss kann Bs Server:
● Gibt eine 302 -Umleitung zurück und richten Sie das Ergebnis auf Domäne A zurück.
● Nest einen Iframe, der auf die A -Domäne in diesem Iframe zeigt.
Beide implementieren schließlich Cross-Domänen-Anrufe. Diese Methode ist funktioneller stärker als die nachstehend eingeführte JSONP, da nach Abschluss des Cross-Domänens kein Problem mit DOM-Operationen und JavaScript-Aufrufen voneinander vorhanden ist. Es gibt jedoch einige Einschränkungen, wie z. Es gibt ein weiteres Problem, das durch den Iframe selbst verursacht wird, und die Interaktion zwischen der übergeordneten Seite und dem Iframe selbst hat Sicherheitsbeschränkungen.
3. Verwenden Sie Skript-Tags, um die Domäne zu domänen . Diese Methode ist auch sehr häufig. Skript -Tags können fremdes JavaScript laden und diese ausführen. Die voreingestellte Rückruffunktion kann die Interaktion mit der übergeordneten Seite realisieren. Es hat einen großen Namen namens JSONP Cross-Domain, eine Abkürzung für JSON mit Polsterung. Es ist ein inoffizielles Protokoll, das offensichtlich Skript lädt. Warum hängt es also mit JSON zusammen? Es stellt sich heraus, dass es diese Rückruffunktion ist. Es gibt eine typische Möglichkeit, es zu verwenden, die die Parameter über JSON übergeben sollen, dh die JSON -Daten in die Rückruffunktion. Dies ist die Bedeutung von JSONPs JSON+Padding.
Es gibt viele JSONP -Dienste im Internet, um Daten bereitzustellen. Im Wesentlichen sind sie Cross-Domain-Anfragen und geben Rückrufe in der Anforderungs-URL an, wie z. B. Callback = Ergebnis. Nach dem Erhalt dieser Daten wird die Ergebnisfunktion automatisch aufgerufen und die Daten werden beispielsweise in Form von JSON übergeben (Suche nach "Fußball"):
http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=football&callback=result
Verwenden Sie jQuery, um es anzurufen und zu schreiben wie:
Die Codekopie lautet wie folgt:
$ .getJson ("http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=football&callback=?", Funktion (Daten) {
// ...
});
Im Allgemeinen besteht die Einschränkung des Cross-Domain-Ansatzes von JSONP darin, dass er nur GET-Anfragen verwenden kann und das Problem nicht lösen kann, wie JavaScript-Anrufe zwischen zwei Seiten in verschiedenen Domänen getätigt werden können.
4. Flash Cross-Domain:
Es wird auf die Datei crossDomain.xml unter dem Stammverzeichnis der Zielwebsite zugreifen und feststellen, ob dieser Cross-Domain-Zugriff basierend auf dem Inhalt in der Datei zuzulassen:
Die Codekopie lautet wie folgt:
<Cross-Domain-Policy>
<degal-access-from domain = "xxx.xxx.com" />
</Cross-Domain-Policy>
5. Das IMG -Tag kann auch verwendet werden , was auch eine sehr häufige Methode ist. Es hat eine schwächere Funktion und kann nur eine Get -Anfrage ohne Rückrufe senden. So wird die Klickzahl von Google bestimmt.
6. Window.PostMessage, ein neuer Mechanismus für die Cross-Domänen-Kommunikation, wird nur von Firefox 3, Safari 4, IE8 und späteren Versionen unterstützt. Der Anruf, um Nachrichten an andere Fenster zu senden, ist wie folgt:
Die Codekopie lautet wie folgt:
otherWindow.postMessage (Nachricht, TargetOrigin);
Im Empfangsfenster muss ein Ereignishandler festgelegt werden, um die gesendeten Nachrichten zu empfangen:
Die Codekopie lautet wie folgt:
window.adDeVentListener ("meldung", forderungsage, false);
Funktionsforschung (Ereignis) {
if (event.orgin! == "http://example.org:8080"))
zurückkehren;
}
Beachten Sie, dass die Ursprungs- und Quellattribute der Nachricht verwendet werden müssen, um die Identität des Absenders zu überprüfen, andernfalls verursacht sie XSS -Schwachstellen.
7. Zugangskontrolle
Einige Browser unterstützen Response-Header wie Access-Control-Allow-Origin, wie beispielsweise:
Die Codekopie lautet wie folgt:
Header ("Access-Control-Allow-Origin: http://www.a.com");
Dies gibt an, dass der Cross-Domain-Zugriff auf www.a.com zulässig ist.
8. Fenster.Name
Dieses Ding wurde tatsächlich als Mittel verwendet, um XSS zu hacken. Die Essenz ist, dass sich die Seite neu geladen wird, wenn sich der Fensterspeicherort ändert. Interessanterweise ändert sich jedoch nicht, sodass Sie den Wert übergeben können. Ändern Sie mit dem Iframe das Fensterobjekt des Iframe mehrmals, und die praktische Cross-Domänen-Datenübertragung wird abgeschlossen.
9. Dokument.Domain
Diese Methode eignet sich für die Cross-Domänen-Kommunikation wie A.Example.com und B.Example.com, da die beiden eine gemeinsame Domäne namens example.com haben. Legen Sie einfach document.domain auf example.com fest, aber wenn Sie zwischen A.Example1.com und b.example2.com kommunizieren möchten, hat es keine Wahl.
10. Fragmentidentitier Messaging (FIM)
Diese Methode ist sehr interessant und erfordert die Zusammenarbeit von IFrames. Fragment -Identitier ist der Teil, der häufig für die Ankerpositionierung nach der Pfundmarke der URL (#) verwendet wird. Änderungen in diesem Teil verursachen keine Aktualisierung der Seiten. Das weibliche Fenster kann nach Belieben auf die URL des Iframe zugreifen, und der Iframe kann auch auf die URL des weiblichen Fensters zugreifen. Dann kann die Kommunikation erreicht werden, indem der Fragmementidentitier geändert wird. Der Nachteil ist, dass die Änderungen der Fragmementidentitur unnötige Geschichte erzeugen und Längenbeschränkungen aufweisen. Darüber hinaus unterstützen einige Browser das Onhashchange -Event nicht.
11. Cross Frame (vgl.)
Diese Methode ist eine Variante der obigen FIM -Methode. Die Essenz von CF und FIM wird tatsächlich in meinem Artikel "GWT First Experience" eingeführt (es wird nur verwendet, um Geschichte und Rückwärtsfunktionen zu implementieren). Es wird dynamisch ein unsichtbares Iframe erzeugen, der auf eine fremde Domäne hinweist. Nach der Verarbeitung enthält der Fragmentidentitier in der URL dieses Iframe die Verarbeitungsergebnisse für die übergeordnete Seite, während die URL des Browsers keine Änderungen hat.
12. Cookie+P3P -Protokoll
Es ist auch ein seltsamer Trick, die Eigenschaften von Cross-Domain-Zugangs-Cookies unter dem P3P-Protokoll zu erreichen, um den Zugang zu Cross-Domänen zu erreichen. P3P ist ein von W3C veröffentlichtes Standard für Datenschutzschutz, mit dem Internetnutzer, die im Internet surfen, Datenschutzschutz bieten. Setzen Sie den Pfad des Cookie auf "/", dh es gibt keine Domänenbeschränkung. Zu diesem Zeitpunkt erlauben einige Browser, dass Seiten anderer URLs gelesen werden, andere nicht. In diesem Fall muss der P3P -Header auf dem Kopf der übergeordneten Seitenantwort festgelegt werden:
Die Codekopie lautet wie folgt:
P3P: cp = "Cura adma deva pao psdo Unser Bus uni pur int dem Sta -com nav otc noi dsp cor"