iframe same-origin sandbox
Henry
- html
Hallo,
im Netz inkl. hier im Wiki gibts die einhellige Aussage, zumindest verstehe ich das so, dass die same-origin Blockade beim iframe aufzuheben möglich wäre.
Dazu habe ich das Fricklbeispiel zum Iframe mal angepasst:
<h1>Fenstergucker</h1>
<button onclick="alert(ifr.srcdoc);">show source iframe</button>
<main>
<p>Gucken Sie mal SELFHTML im Fenster an:</p>
<iframe id="ifr" src="https://wiki.selfhtml.org/wiki/Startseite"
width="90%" height="400" name="SELFHTML_in_a_box" sandbox="allow-same-origin">
<p>Ihr Browser kann leider keine eingebetteten Frames anzeigen: Sie können die eingebettete
Seite über den folgenden Verweis aufrufen: <a href="https://wiki.selfhtml.org/wiki/Startseite">SELFHTML</a> </p>
</iframe>
</main>
Jetzt hatte ich erwartet, dass die Aussage…
"allow-same-origin: ermöglicht den Inhalt des iframes als same-origin zu behandeln"
…bedeutet ich könne den Inhalt dann auslesen ohne am Browser was umstellen zu müssen. Geht aber nicht, also
Gruss
Henry
Hallo Henry,
- gehe ich das falsch an?
- oder verstehe ich die Erklärung falsch?
- oder ist die Erklärung nicht richtig?
Die Erklärung ist falsch. allow-same-origin
erlaubt es dem Dokument, die Origin zu behalten. Ansonsten wäre das eingebettete Dokument in einer eigenen, unique Origin. Z.B. wenn ich in einem sandboxed iframe ein Dokument von http://example.com lade, ist die Origin nicht https://example.com
sondern eine eigene. Erst mit dem Attribut allow-same-origin
wird die Origin https://example.com
beibehalten. Damit hat der iFrame dann Zugriff auf die Daten (Cookies, local storage, etc) der Origin.
Es ist nicht möglich, auf das DOM des eingebetteten Dokuments zuzugreifen. Du kannst mit dem eingebetteten Dokument nur über Mechanismen wie window.postMessage
kommunizieren.
Freundliche Grüße,
Christian Kruse
Hallo Christian Kruse,
Die Erklärung ist falsch.
allow-same-origin
erlaubt es dem Dokument, die Origin zu behalten.
Magst du das bitte im Wiki korrigieren?
Bis demnächst
Matthias
Hallo Matthias,
Hallo Christian Kruse, Magst du das bitte im Wiki korrigieren?
ich glaube das ist gar nicht so einfach dies verständlich zu erklären. Ich habe Christians Erklärung hier auch noch nicht ganz verstanden bin mir auch nicht sicher ob Autoren anderer Seiten das richtig verstehen. Bräuchte man wahrscheinlich konkrete Fallbeispiele dazu.
Gruss
Henry
Hallo Christian,
Die Erklärung ist falsch.
allow-same-origin
erlaubt es dem Dokument, die Origin zu behalten. Ansonsten wäre das eingebettete Dokument in einer eigenen, unique Origin. Z.B. wen…
Danke, aber so ganz hab ich es noch nicht verstanden.
Es ist nicht möglich, auf das DOM des eingebetteten Dokuments zuzugreifen. Du kannst mit dem eingebetteten Dokument nur über Mechanismen wie
window.postMessage
kommunizieren.
Guter Hinweis, habe auch ne schöne Seite dafür gefunden, komme aber noch nicht so zurecht beim Testen. Muss ich mir gleich mal in Ruhe anschauen.
Gruss
Henry
Hallo Henry,
Die Erklärung ist falsch.
allow-same-origin
erlaubt es dem Dokument, die Origin zu behalten. Ansonsten wäre das eingebettete Dokument in einer eigenen, unique Origin. Z.B. wen…Danke, aber so ganz hab ich es noch nicht verstanden.
OK. Ich versuchs nochmal anders. Stell dir vor du hast eine Seite auf example.com, die diesen Code enthält:
<iframe src="http://example.org/foo" sandbox></iframe>
Dieser iframe wir keinen Zugriff auf Daten der Origin example.org
haben. Keine Cookies, kein localStorage
, nichts. Wenn du dagegen den Code änderst auf diesen:
<iframe src="http://example.org/foo" sandbox="allow-same-origin"></iframe>
dann erhält die Seite auf einmal Zugriff auf die Daten der Domain, also Cookies, localStorage, etc. Ich hab das mal nachgestellt: https://static.wwwtech.de/test.html enthält das einzubettende Dokument, der nichts anderes macht als ein Datum in den localStorage
zu schreiben und wieder auszulesen. https://static.wwwtech.de/test1.html enthält zwei iframes, die die erste URL einbinden: eins mit sandbox="allow-scripts"
und eins mit sandbox="allow-scripts allow-same-origin"
. Das erste Dokument darf den localStorage
nicht auslesen und bekommt dadurch sogar eine Exception. Das zweite Dokument darf den localStorage
auslesen.
Freundliche Grüße,
Christian Kruse
Hallo Ingrid,
wohlgemerkt: dass test1.html
auf der gleichen Domain liegt ist irrelevant. Ich hatte nur so schnell keine zweite zur Verfügung.
Freundliche Grüße,
Christian Kruse
Hallo Christian,
fast hätte ich gedacht, ich hätte es verstanden. Aber
wohlgemerkt: dass test1.html auf der gleichen Domain liegt ist irrelevant.
war das nicht genau der Punkt? Dass einbettende und eingebettete Seite von der gleichen Domain kommen (also: gleichen Origin haben) und der sandbox-Parameter genau für diesen Fall erlaubt, dass ein Zugriff möglich ist?
Rolf
Hallo Rolf,
wohlgemerkt: dass test1.html auf der gleichen Domain liegt ist irrelevant.
war das nicht genau der Punkt? Dass einbettende und eingebettete Seite von der gleichen Domain kommen (also: gleichen Origin haben) und der sandbox-Parameter genau für diesen Fall erlaubt, dass ein Zugriff möglich ist?
Nein. Es erlaubt der eigebetteten Seite den Zugriff auf die eigene Origin. Ohne den Parameter hat die eingebettete Seite Zugriff auf keine Origin.
Auf die Origin des Openers hat die eingebettete Seite nie Zugriff, es sei denn, sie kommen von der gleichen Origin 🤣
Freundliche Grüße,
Christian Kruse
Hallo Ingrid,
vielleicht wird es klarer, wenn man den Sinn erkennt. Das ist eine Mitigation-Strategie gegen XSS- und CSRF-Lücken. Wenn der Angreifer es schafft, die URL eines iframe
zu verändern, dann schützt einen das sandbox
-Attribut dagegen, dass ein ungewollter Request mit Benutzerrechten ausgeführt wird. allow-same-origin
heisst also nicht „erlaube Same-Origin des Openers,“ sondern „erlaube Same-Origin-Requests.“
Freundliche Grüße,
Christian Kruse
Hallo Christian,
nee, jetzt versteh ich gar nichts mehr. Aber ich lese jetzt erstmal andere Dokumente zum Thema, bevor Du Dir die Finger wundschreibst.
Rolf
Hallo Rolf,
*kopfkratz* ich wüsste jetzt auch wirklich nicht, wie ich das noch erklären sollte, sorry 😟 sandbox
entfernt das Recht der eingebetteten Seite, auf die eigenen Daten zuzugreifen. sandbox="allow-same-origin"
gibt das Recht wieder zurück.
Freundliche Grüße,
Christian Kruse
Hallo Christian,
sandbox
entfernt das Recht, auf die eigenen Daten zuzugreifen.sandbox="allow-same-origin"
gibt das Recht wieder zurück.
ich glaube, das war der entscheindende Hinweis (besonders der erste Teil).
Jedenfalls für mich.
Live long and pros healthy,
Martin
Hallo Christian,
oh. Dito!
Rolf