Politik gleicher Herkunft
Sie können<iframe>
mit JavaScript nicht auf eine andere Herkunft zugreifen. Dies wäre eine große Sicherheitslücke, wenn Sie dies tun könnten. Für Richtlinienbrowser mit demselben Ursprung blockieren Skripte, die versuchen, auf einen Frame mit einem anderen Ursprung zuzugreifen .
Die Herkunft wird als unterschiedlich angesehen, wenn mindestens einer der folgenden Teile der Adresse nicht beibehalten wird:
<protocol>://<hostname>:<port>/...
Protokoll , Hostname und Port müssen mit Ihrer Domain identisch sein, wenn Sie auf einen Frame zugreifen möchten.
Hinweis: Internet Explorer nicht streng an diese Regel bekannt ist, finden Sie hier für weitere Details.
Beispiele
Folgendes würde passieren, wenn Sie versuchen, auf die folgenden URLs zuzugreifen http://www.example.com/home/index.html
URL RESULT
http://www.example.com/home/other.html -> Success
http://www.example.com/dir/inner/another.php -> Success
http://www.example.com:80 -> Success (default port for HTTP)
http://www.example.com:2251 -> Failure: different port
http://data.example.com/dir/other.html -> Failure: different hostname
https://www.example.com/home/index.html:80 -> Failure: different protocol
ftp://www.example.com:21 -> Failure: different protocol & port
https://google.com/search?q=james+bond -> Failure: different protocol, port & hostname
Problemumgehung
Auch wenn Same Origin Policy Blöcke Skripte von den Inhalt der Seiten mit einer anderen Herkunft zugreifen, wenn Sie beide Seiten besitzen, können Sie dieses Problem mit umgehen window.postMessage
und seine relative message
Ereignismeldungen zwischen den beiden Seiten zu senden, wie folgt aus :
Auf Ihrer Hauptseite:
let frame = document.getElementById('your-frame-id');
frame.contentWindow.postMessage(/*any variable or object here*/, 'http://your-second-site.com');
Das zweite Argument postMessage()
kann darin bestehen '*'
, keine Präferenz für den Ursprung des Ziels anzugeben. Wenn möglich, sollte immer ein Zielursprung angegeben werden, um zu vermeiden, dass die Daten, die Sie an eine andere Site senden, weitergegeben werden.
In Ihrem <iframe>
(auf der Hauptseite enthalten):
window.addEventListener('message', event => {
// IMPORTANT: check the origin of the data!
if (event.origin.startsWith('http://your-first-site.com')) {
// The data was sent from your site.
// Data sent with postMessage is stored in event.data:
console.log(event.data);
} else {
// The data was NOT sent from your site!
// Be careful! Do not use it. This else branch is
// here just for clarity, you usually shouldn't need it.
return;
}
});
Diese Methode kann in beide Richtungen angewendet werden , indem auch auf der Hauptseite ein Listener erstellt und Antworten vom Frame empfangen werden. Dieselbe Logik kann auch in Popups und grundsätzlich in jedem neuen Fenster implementiert werden, das von der Hauptseite generiert wird (z. B. mithilfe von window.open()
), ohne Unterschied.
Deaktivieren der Richtlinie für denselben Ursprung in Ihrem Browser
Es gibt bereits einige gute Antworten zu diesem Thema (ich habe sie gerade beim Googeln gefunden). Für die Browser, in denen dies möglich ist, werde ich die entsprechende Antwort verknüpfen. Beachten Sie jedoch, dass das Deaktivieren der Richtlinie mit demselben Ursprung nur Ihren Browser betrifft . Wenn Sie einen Browser mit deaktivierten Sicherheitseinstellungen für denselben Ursprung ausführen, erhält jede Website Zugriff auf Ressourcen mit unterschiedlichen Ursprüngen. Dies ist daher sehr unsicher und sollte NIEMALS durchgeführt werden, wenn Sie nicht genau wissen, was Sie tun (z . B. Entwicklungszwecke) .
Access-Control-Allow-Origin
nicht für iFrames gilt, sonderncanvas.drawImage
nur für XHRs, Schriftarten, WebGL und . Ich glaube, daspostMessage
ist die einzige Option.iframe.src
, und wenn sich die Site vom Hostnamen Ihrer Domain unterscheidet, können Sie nicht auf diesen Frame zugreifen.~
gibt das 2er-Komplement der Zahl zurück,n
wird also-n-1
, was bedeutet, dass nur-1
wird0
(was als interpretiert wirdfalse
) und jeder andere Wert den Test besteht. IE0 = -(-1)-1
nicht-(-1+1)
.location.ancestorOrigins[0]
ist der Speicherort des übergeordneten Frames. Wenn Ihr Frame auf einer anderen Site ausgeführt wird und Sie überprüfenevent.origin.indexOf(location.ancestorOrigins[0])
, ob der Ursprung des Ereignisses die Frame-Adresse des übergeordneten Elements enthält, die immer sein wirdtrue
, erlauben Sie jedem übergeordneten Frame mit einem beliebigen Ursprung , auf Ihren Frame zuzugreifen ist offensichtlich nicht etwas, was Sie tun möchten. Darüber hinausdocument.referrer
ist auch schlechte Praxis, wie ich bereits in den Kommentaren oben erklärt habe.Ergänzung zu Marco Bonellis Antwort: Die derzeit beste Art der Interaktion zwischen Frames / Iframes ist die Verwendung
window.postMessage
, die von allen Browsern unterstützt wirdquelle
window.postMessage
funktioniert, würde nur die akzeptierte Antwort duplizieren, auf die ich bereits verweise. Darüber hinaus ist der wesentliche Wert, den meine Antwort hinzufügt, genau der, auf externe Dokumentation zu verweisen.Überprüfen Sie den Webserver der Domain auf
http://www.<domain>.com
Konfiguration.X-Frame-Options
Es handelt sich um eine Sicherheitsfunktion, die ClickJacking-Angriffe verhindert.Wie funktioniert clickJacking?
Technisch hat das Böse eine
iframe
mit der Quelle zur Opferseite.Wie die Sicherheitsfunktion funktioniert
Wenn Sie verhindern möchten, dass Webserveranforderungen innerhalb eines X gerendert werden,
iframe
fügen Sie die X-Frame-Optionen hinzuDie Optionen sind:
Dies ist ein IIS-Konfigurationsbeispiel:
Die Lösung der Frage
Wenn der Webserver die Sicherheitsfunktion aktiviert hat, kann dies zu einem clientseitigen Sicherheitsfehler führen.
quelle
Für mich wollte ich einen 2-Wege-Handshake implementieren, was bedeutet:
- Das übergeordnete Fenster wird schneller geladen als der Iframe.
- Der Iframe sollte mit dem übergeordneten Fenster sprechen, sobald es fertig ist
- Das übergeordnete ist bereit, die Iframe-Nachricht zu empfangen und wiederzugeben
Dieser Code wird verwendet, um das weiße Etikett im Iframe mithilfe des Codes [CSS Custom Property]
:
Iframe festzulegen
Elternteil
Natürlich können Sie die Herkunft und den Text einschränken. Dies ist ein einfach zu
handhabender Code. Ich fand dieses Beispiel hilfreich: [ Domainübergreifendes
Messaging mit postMessage]
quelle
Ich möchte eine Java Spring-spezifische Konfiguration hinzufügen, die sich darauf auswirken kann.
In der Website oder Gateway-Anwendung gibt es eine contentSecurityPolicy-Einstellung
Im Frühjahr finden Sie die Implementierung der Unterklasse WebSecurityConfigurerAdapter
...
Der Browser wird blockiert, wenn Sie hier keinen sicheren externen Inhalt definiert haben.
quelle
Wenn Sie die Kontrolle über den Inhalt des Iframes haben, dh wenn er lediglich in einem Cross-Origin-Setup wie Amazon Mechanical Turk geladen wird, können Sie dieses Problem mit dem umgehen
<body onload='my_func(my_arg)'>
Attribut für das innere HTML .Verwenden Sie beispielsweise für das innere HTML den
this
Parameter html (yes -this
ist definiert und bezieht sich auf das übergeordnete Fenster des inneren Body-Elements):<body onload='changeForm(this)'>
Im inneren HTML:
quelle
chrome.exe --user-data-dir="C://Chrome dev session" --disable-web-security
quelle