Suche…


Einführung

Die Same-Origin-Richtlinie wird von Webbrowsern verwendet, um zu verhindern, dass Skripts auf Remote-Inhalte zugreifen können, wenn die Remote-Adresse nicht den gleichen Ursprung des Skripts hat. Dadurch wird verhindert, dass schädliche Skripts Anfragen an andere Websites abrufen, um vertrauliche Daten zu erhalten.

Der Ursprung von zwei Adressen wird als identisch angesehen, wenn beide URLs dasselbe Protokoll , denselben Hostnamen und denselben Port aufweisen .

Möglichkeiten, die Same-Origin-Richtlinie zu umgehen

Für clientseitige JavaScript-Engines (solche, die in einem Browser ausgeführt werden) gibt es keine unkomplizierte Lösung für das Anfordern von Inhalten aus anderen Quellen als der aktuellen Domäne. (Diese Einschränkung existiert übrigens nicht in JavaScript-Server-Tools wie Node JS.)

Es ist jedoch (in manchen Situationen) tatsächlich möglich, Daten mit anderen Methoden aus anderen Quellen abzurufen. Bitte beachten Sie, dass einige von ihnen Hacks oder Workarounds enthalten können, anstatt auf Lösungen zu setzen, auf die das Produktionssystem angewiesen ist.

Methode 1: KERN

Die meisten öffentlichen APIs ermöglichen es Entwicklern heute, Daten bidirektional zwischen Client und Server zu senden, indem sie eine Funktion namens CORS (Cross-Origin Resource Sharing) aktivieren. Der Browser überprüft, ob ein bestimmter HTTP-Header ( Access-Control-Allow-Origin ) festgelegt ist und die Domäne der anfragenden Site im Wert des Headers aufgeführt ist. Wenn dies der Fall ist, erlaubt der Browser das Einrichten von AJAX-Verbindungen.

Da Entwickler die Antwortheader anderer Server jedoch nicht ändern können, kann nicht immer auf diese Methode zurückgegriffen werden.

Methode 2: JSONP

JSON mit P- Addition wird im Allgemeinen als Problemumgehung bezeichnet. Es ist nicht die einfachste Methode, aber die Arbeit wird trotzdem erledigt. Diese Methode nutzt die Tatsache, dass Skriptdateien von jeder Domäne geladen werden können. Es ist jedoch wichtig zu erwähnen, dass die Anforderung von JavaScript-Code aus externen Quellen immer ein potenzielles Sicherheitsrisiko darstellt. Dies sollte generell vermieden werden, wenn eine bessere Lösung verfügbar ist.

Die mit JSONP angeforderten Daten sind in der Regel JSON. Dies entspricht der in JavaScript für die Objektdefinition verwendeten Syntax, wodurch diese Transportmethode sehr einfach wird. Eine übliche Methode, um Websites die über JSONP erhaltenen externen Daten verwenden zu lassen, besteht darin, sie in eine Callback-Funktion zu packen, die über einen GET Parameter in der URL festgelegt wird. Sobald die externe Skriptdatei geladen ist, wird die Funktion mit den Daten als ersten Parameter aufgerufen.

<script>
function myfunc(obj){
    console.log(obj.example_field);
}
</script>
<script src="http://example.com/api/endpoint.js?callback=myfunc"></script>

Der Inhalt von http://example.com/api/endpoint.js?callback=myfunc kann folgendermaßen aussehen:

myfunc({"example_field":true})

Die Funktion muss immer zuerst definiert werden, sonst wird sie beim Laden des externen Skripts nicht definiert.

Sichere Cross-Origin-Kommunikation mit Nachrichten

Die window.postMessage() -Methode kann zusammen mit ihrer relativen Ereignisbehandlungsroutine window.onmessage sicher verwendet werden, um die Kommunikation über die Herkunft hinweg zu ermöglichen.

Die postMessage() Methode des window kann eine Nachricht an einen anderen senden aufgerufen werden window , die in der Lage sein wird , es mit seinen abzufangen onmessage Event - Handler, erarbeiten sie, und, falls erforderlich, eine Antwort an den Absender zurück Fenster senden mit postMessage() erneut.

Beispiel für ein Fenster, das mit einem untergeordneten Rahmen kommuniziert

  • Inhalt von http://main-site.com/index.html :

     <!-- ... -->
     <iframe id="frame-id" src="http://other-site.com/index.html"></iframe>
     <script src="main_site_script.js"></script>
     <!-- ... -->
    
  • Inhalt von http://other-site.com/index.html :

     <!-- ... -->
     <script src="other_site_script.js"></src>
     <!-- ... -->
    
  • Inhalt von main_site_script.js :

     // Get the <iframe>'s window
     var frameWindow = document.getElementById('frame-id').contentWindow;
    
     // Add a listener for a response
     window.addEventListener('message', function(evt) {
         
         // IMPORTANT: Check the origin of the data! 
         if (event.origin.indexOf('http://other-site.com') == 0) {
             
             // Check the response
             console.log(evt.data);
             /* ... */
         }
     });        
    
     // Send a message to the frame's window
     frameWindow.postMessage(/* any obj or var */, '*');
    
  • Inhalt von other_site_script.js :

     window.addEventListener('message', function(evt) { 
    
         // IMPORTANT: Check the origin of the data! 
         if (event.origin.indexOf('http://main-site.com') == 0) {
             
             // Read and elaborate the received data
             console.log(evt.data);
             /* ... */
    
             // Send a response back to the main window
             window.parent.postMessage(/* any obj or var */, '*');
         }
     });
    


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow