Greifen Sie über den Iframe auf die übergeordnete URL zu

187

Okay, ich habe eine Seite auf und auf dieser Seite habe ich einen Iframe. Was ich tun muss, ist auf der Iframe-Seite herauszufinden, wie die URL der Hauptseite lautet.

Ich habe mich umgesehen und weiß, dass dies nicht möglich ist, wenn sich meine Iframe-Seite in einer anderen Domain befindet, da es sich um Cross-Site-Scripting handelt. Aber überall, wo ich gelesen habe, heißt es, wenn sich die Iframe-Seite in derselben Domäne wie die übergeordnete Seite befindet, sollte sie funktionieren, wenn ich zum Beispiel Folgendes tue:

parent.document.location
parent.window.document.location
parent.window.location
parent.document.location.href

... oder ähnliche Kombinationen, da es mehrere Möglichkeiten zu geben scheint, die gleichen Informationen zu erhalten.

Wie auch immer, hier ist das Problem. Mein Iframe befindet sich in derselben Domain wie die Hauptseite, aber nicht in derselben SUB-Domain. So habe ich zum Beispiel

http: // www.mysite.com/pageA.html

und dann ist meine iframe URL

http: // qa-www.mysite.com/pageB.html

Wenn ich versuche, die URL von pageB.html(der Iframe-Seite) abzurufen, erhalte ich immer den gleichen Fehler, bei dem der Zugriff verweigert wurde. Es scheint also, dass sogar Subdomains als Cross-Site-Scripting gelten. Ist das richtig oder mache ich etwas falsch?

chronofwar
quelle
Können Sie es einfach in der Frame-URL übergeben? Wie<iframe src="url?parent=parent-url"></iframe>
Biagio Arobba

Antworten:

21

Du hast Recht. Subdomains werden bei Verwendung von Iframes weiterhin als separate Domains betrachtet. Es ist möglich, Nachrichten mit zu übergeben postMessage(...), aber auf andere JS-APIs wird absichtlich nicht zugegriffen.

Es ist auch weiterhin möglich, die URL je nach Kontext abzurufen. Weitere Antworten finden Sie in anderen Antworten.

Dan Herbert
quelle
1
Okay, das bläst einfach. Aber zumindest weiß ich, dass ich nicht verrückt werde :(
na ja
9
Wie ist dies die ausgewählte Antwort? Im Folgenden finden Sie viel bessere Beschreibungen möglicher Lösungen.
Anoyz
1
Einverstanden! Die Antwort unten mit 80 Stimmen ist viel besser. Diese Antwort ist in der HTML-Spezifikation.
Ligemer
4
Sie KÖNNEN zwischen den beiden interagieren. Sie müssen jedoch das folgende Skript sowohl für den übergeordneten als auch für den iframe hinzufügen: <script> document.domain = "mydomain.com"; </ script>
George,
2
"Weitere Antworten finden Sie in anderen Antworten." hahah Es ist wie: Ich habe keine Lösung, sehe andere Antworten, aber akzeptiere auch meine Antwort.
Milad
370

Ja, der Zugriff auf die URL der übergeordneten Seite ist nicht zulässig, wenn sich der Iframe und die Hauptseite nicht in derselben (Unter-) Domäne befinden. Wenn Sie jedoch nur die URL der Hauptseite (dh die Browser-URL) benötigen, können Sie Folgendes versuchen:

var url = (window.location != window.parent.location)
            ? document.referrer
            : document.location.href;

Hinweis:

window.parent.locationist erlaubt; Es vermeidet den Sicherheitsfehler im OP, der durch den Zugriff auf die hrefEigenschaft window.parent.location.hrefverursacht wird : verursacht "Blockierte einen Frame mit Ursprung ..."

document.referrerbezieht sich auf "den URI der Seite, die mit dieser Seite verlinkt ist". Dadurch wird das enthaltene Dokument möglicherweise nicht zurückgegeben , wenn eine andere Quelle den iframeSpeicherort bestimmt hat, z. B.:

  • Container iframe @ Domain 1
  • Sendet einen untergeordneten Iframe an Domäne 2
  • Aber im untergeordneten Iframe ... Domäne 2 leitet zu Domäne 3 um (dh zur Authentifizierung, möglicherweise SAML), und dann leitet Domäne 3 zurück zu Domäne 2 (dh über Formularübermittlung (), eine Standard-SAML-Technik).
  • Für den untergeordneten Iframe document.referrerist dies Domäne 3 , nicht die enthaltende Domäne 1

document.locationbezieht sich auf "ein Standortobjekt, das Informationen über die URL des Dokuments enthält"; vermutlich das aktuelle Dokument, dh der aktuell geöffnete Iframe. Wenn window.location === window.parent.location, dann ist der Iframe hrefder gleiche wie der des enthaltenden Elternteils href.

Vaibhav
quelle
1
@jepser, weil sich Ihr Iframe in diesem Iframe befindet. Mit diesem in der Mitte haben Sie nie Zugriff auf den oberen Rahmen. verschachtelte domänenübergreifende iframes sind auf so vielen Ebenen falsch. Aber vielleicht können Sie das umgehen, wenn Sie document.domainden oberen und den innersten Rahmen einstellen . vielleicht.
GCB
2
Oder etwas kompakter:var url = (parent !== window) ? document.referrer : document.location;
thekingoftruth
2
Bitte beachten Sie, dass es nicht funktioniert, wenn sich der Container auf Ihrem lokalen Host befindet (oder allgemeiner, wenn diese Seite nicht von einem Webserver geöffnet wird) oder per Datei aufgerufen wird: //.
Guillaume Renoult
5
Es ist zu beachten, dass dies mit dem Referer-PolicyHeader besiegt werden kann .
Dan Atkinson
2
Dies scheint nicht mit Edge-Browser zu funktionieren - der Referrer wird eine leere Zeichenfolge sein. Stackoverflow.com/questions/24169219/…
Davide Orazio Montersino
51

Ich habe gerade eine Problemumgehung für dieses Problem gefunden, die so einfach ist, und dennoch habe ich nirgendwo Diskussionen gefunden, die dies erwähnen. Es erfordert die Steuerung des übergeordneten Frames.

Angenommen, Sie möchten in Ihrem iFrame diesen Iframe: src = "http://www.example.com/mypage.php"

Nun, anstelle von HTML, um den Iframe anzugeben, verwenden Sie ein Javascript, um den HTML-Code für Ihren Iframe zu erstellen, rufen Sie die übergeordnete URL "zur Erstellungszeit" über Javascript ab und senden Sie sie als URL-GET-Parameter im Querystring Ihres src-Ziels, wie z so:

<script type="text/javascript">
  url = parent.document.URL;
  document.write('<iframe src="http://example.com/mydata/page.php?url=' + url + '"></iframe>');
</script>

Suchen Sie sich dann eine Javascript-URL-Analysefunktion, die die URL-Zeichenfolge analysiert, um die URL-Variable zu erhalten, nach der Sie suchen. In diesem Fall handelt es sich um "URL".

Ich habe hier einen großartigen URL-String-Parser gefunden: http://www.netlobo.com/url_query_string_javascript.html

Gregory Lewis
quelle
Diese Antwort in Kombination mit stackoverflow.com/a/7739035/216084 erledigt den Job.
2
Dies war ein wunderbarer Vorschlag. Für diejenigen, die den übergeordneten HTML-Iframe-Code schreiben, würde dies die Rechnung bezahlen. Wir haben in unserer Pixel-Software etwas sehr Ähnliches verwendet.
Ligemer
Danke dir!! Dies ist eine effektive Problemumgehung, bei der die standortübergreifenden Regeln weiterhin eingehalten werden.
theUtherSide
Aber schreiben Sie alle URLs im HTML auf dem Server neu? Wenn ein Benutzer sonst auf einen Link im iFrame klickt, kann er weiterhin nicht darauf zugreifen.
Roel
@Roel Sie können sie alle zur Serverzeit schreiben (im Wesentlichen "harter Code" für diese Antwort) oder diese Antwort in Javascript ausführen, z. B. nachdem die Seite geladen wurde, werden die gewünschten Iframes eingefügt.
Rogerdpack
34

Wenn Ihr Iframe von einer anderen Domain stammt (domänenübergreifend), müssen Sie einfach Folgendes verwenden:

var currentUrl = document.referrer;

und - hier hast du die Haupt-URL!

ParPar
quelle
Das hat in meinem Fall nicht funktioniert, da ich denke, dass der iFrame selbst dynamisch generiert wurde oder andere Tricks ausgeführt hat. Ich habe jedenfalls nicht die Antwort bekommen, die ich erwartet hatte.
Muskie
Dies sollte in allen Browsern funktionieren. Es sei denn in neueren Browsern, wenn Sie Sandboxing-Parameter senden, aber ich bezweifle, dass dies der Fall ist. Dies funktioniert unabhängig von domänenübergreifend.
GCB
Wenn sich die Seite im Iframe über Javascript (z. B. window.location.reload(true)) neu geladen hat, funktioniert dies nicht mehr. Dann ist Referrer die URL des Iframes selbst.
Mori
20

Für Seiten in derselben Domain und in verschiedenen Subdomains können Sie die document.domainEigenschaft über Javascript festlegen .

Sowohl der übergeordnete Frame als auch der Iframe müssen ihre document.domain auf etwas setzen, das zwischen ihnen üblich ist.

dh www.foo.mydomain.comund api.foo.mydomain.comkönnte jeder entweder foo.mydomain.comoder nur verwenden mydomain.comund kompatibel sein (nein, aus comSicherheitsgründen können Sie nicht beide einstellen ...)

Beachten Sie außerdem, dass document.domain eine Einbahnstraße ist. Führen Sie die folgenden drei Anweisungen nacheinander aus:

// assume we're starting at www.foo.mydomain.com
document.domain = "foo.mydomain.com" // works
document.domain = "mydomain.com" // works
document.domain = "foo.mydomain.com" // throws a security exception

Moderne Browser können auch window.postMessage verwenden, um über Ursprünge hinweg zu sprechen, dies funktioniert jedoch nicht in IE6. https://developer.mozilla.org/en/DOM/window.postMessage

user409021
quelle
3
Bitte akzeptieren Sie dies als Antwort, da dies sowohl möglich ist als auch in der Google-Suche angezeigt wird.
Metagrapher
17

Die folgende Zeile funktioniert: document.location.ancestorOrigins[0]Diese gibt den Vorgängerdomänennamen zurück.

Robert-Jan Kuyper
quelle
Nach Änderungen an Chrome ist dies nun die richtige Antwort für viele Browser.
Dan Atkinson
Nicht die vollständige URL. Nur die Domain
TheMaster
document.location.ancestorOriginskehrt undefinedfür mich zurück
Miguel Mota
9

Versuch es:

document.referrer

Wenn Sie sich ändern, befinden Sie sich in einem Iframe. Ihr Host ist "Referrer".

Benjamim William L. Nunes
quelle
2

Ich hatte Probleme damit. Wenn Sie beim ersten Laden Ihrer Seite im iframe Grab eine Sprache wie PHP verwenden $_SERVER['HTTP_REFFERER']und diese auf eine Sitzungsvariable setzen.

Auf diese Weise kennen Sie beim Laden der Seite im Iframe die vollständige übergeordnete URL und Abfragezeichenfolge der Seite, die sie geladen hat. Mit der Cross-Browser-Sicherheit ist es ein bisschen Kopfzerbrechen, wenn Sie auf window.parent irgendetwas setzen, wenn Sie verschiedene Domains haben.

Hyzer Deeds
quelle
2
var url = (window.location != window.parent.location) ? document.referrer: document.location;

Ich habe festgestellt, dass das oben vorgeschlagene Beispiel zuvor funktioniert hat, als das Skript in einem Iframe ausgeführt wurde. Es hat jedoch die URL nicht abgerufen, als das Skript außerhalb eines Iframes ausgeführt wurde. Eine geringfügige Anpassung war erforderlich:

var url = (window.location != window.parent.location) ? document.referrer: document.location.href;
user3523340
quelle
2
Wenn Sie sich außerhalb des Iframes befinden und das Skript auf dem übergeordneten Frame ausführen, müssen Sie nichts überprüfen.
Art3mix
1

Ich konnte die vorherige Lösung nicht zum Laufen bringen, aber ich fand heraus, dass ich http:otherdomain.com/page.htm?from=thisdomain.com/thisfolderim iframe-Extrakt thisdomain.com/thisfoldermit folgendem Javascript Folgendes tun könnte, wenn ich beispielsweise das iframe-Skript mit einstelle :

var myString = document.location.toString();
var mySplitResult = myString.split("=");
fromString = mySplitResult[1];
Paul
quelle
1

Das Problem mit PHP $ _SERVER ['HTTP_REFFERER'] besteht darin, dass die vollständig qualifizierte Seiten-URL der Seite angegeben wird, die Sie zur übergeordneten Seite geführt hat. Das ist nicht dasselbe wie die übergeordnete Seite. Schlimmer noch, manchmal gibt es keinen http_referer, weil die Person die URL der übergeordneten Seite eingegeben hat. Wenn ich also von yahoo.com zu Ihrer übergeordneten Seite komme, wird yahoo.com zum http_referer und nicht zu Ihrer Seite.

TARKUS
quelle
1

Ich habe in den Fällen, in denen $_SERVER['HTTP_REFERER']nicht funktioniert (ich sehe dich an, Safari), $_SERVER['REDIRECT_SCRIPT_URI']eine nützliche Sicherung gefunden.

Dan
quelle
0

In Chrome ist es möglich, location.ancestorOrigins zu verwenden. Es werden alle übergeordneten URLs zurückgegeben

Gena Moroz
quelle
0

Ich weiß, dass er super alt ist, aber es ist unglaublich, dass niemand empfohlen hat, nur Cookies von einer Domain zur anderen zu übertragen. Während Sie Subdomains verwenden, können Sie Cookies von einer Basisdomain für alle Subdomains freigeben, indem Sie einfach Cookies auf die URL setzen.basedomain.com

Dann können Sie alle benötigten Daten über die Cookies teilen.

Bruce
quelle
-1

Dies funktionierte für mich, um auf die iframe src-URL zuzugreifen.

window.document.URL
user1503606
quelle
-4

Holen Sie sich alle übergeordneten Iframe-Funktionen und HTML

var parent = $(window.frameElement).parent();
        //alert(parent+"TESTING");
        var parentElement=window.frameElement.parentElement.parentElement.parentElement.parentElement;
        var Ifram=parentElement.children;      
        var GetUframClass=Ifram[9].ownerDocument.activeElement.className;
        var Decision_URLLl=parentElement.ownerDocument.activeElement.contentDocument.URL;
Vijay Kumar
quelle
Ich nehme nicht an, dass Sie diese Antwort für diejenigen von uns erweitern können, die jQuery nicht verwenden (eine wachsende Zahl, sollte ich darauf hinweisen, da jQuery in den letzten Jahren unnötig geworden ist). Zumindest schlage ich vor, klar zu machen, dass diese Antwort von jQuery abhängt und das OP jQuery überhaupt nicht erwähnt hat.
Carnix