it-swarm.com.de

Greifen Sie über iframe auf die übergeordnete URL zu

Okay, ich habe eine Seite 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 herumgesucht und weiß, dass dies nicht möglich ist, wenn sich meine iframe-Seite in einer anderen Domäne befindet, da es sich um Cross-Site-Scripting handelt. Aber überall, wo ich gelesen habe, heißt es, dass die iframe-Seite, wenn sie sich in derselben Domäne wie die übergeordnete Seite befindet, funktionieren sollte, wenn ich zum Beispiel:

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

... oder andere ähnliche Kombinationen, da es mehrere Möglichkeiten gibt, dieselben Informationen zu erhalten. 

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

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) zu übernehmen, erhalte ich immer den gleichen Zugriff, der den Zugriff verweigert. Es scheint also, dass sogar Subdomains als Cross-Site-Scripting gelten. Ist das richtig, oder mache ich etwas falsch?

153
chronofwar

Du hast Recht. Sub-Domains werden bei der Verwendung von Iframes immer noch als separate Domains betrachtet. Es ist möglich, Nachrichten mit postMessage(...) zu übergeben, aber andere JS-APIs werden absichtlich nicht zugänglich gemacht.

Es ist auch immer noch möglich, die URL abhängig vom Kontext abzurufen. Weitere Informationen finden Sie in den anderen Antworten.

19
Dan Herbert

Ja, der Zugriff auf die URL der übergeordneten Seite ist nicht zulässig, wenn sich iframe und Hauptseite nicht in derselben (Unter-) Domäne befinden. Wenn Sie jedoch nur die URL der Hauptseite (d. H. 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.location ist erlaubt; Es vermeidet den Sicherheitsfehler im OP, der durch den Zugriff auf die Eigenschaft href verursacht wird: window.parent.location.href verursacht "Blockiert einen Frame mit Origin ..."

document.referrer bezieht sich auf "den URI der Seite, die mit dieser Seite verlinkt ist." Dies kann not das enthaltende -Dokument zurückgeben, wenn eine andere Quelle die iframe-Position bestimmt hat, zum Beispiel:

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

document.location verweist auf "ein Location-Objekt, das Informationen zur URL des Dokuments enthält"; vermutlich das current -Dokument, dh der aktuell geöffnete iframe. Wenn window.location === window.parent.location, dann ist die href des Iframes gleich wie die href des übergeordneten Elternteils.

307
Vaibhav

Ich habe gerade eine Problemumgehung für dieses Problem entdeckt, das so einfach ist, und trotzdem habe ich nirgendwo Diskussionen gefunden, in denen es erwähnt wird. Es erfordert die Steuerung des übergeordneten Rahmens.

Sagen Sie in Ihrem iFrame, Sie möchten 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 durch Javascript "at build time" ab und senden Sie sie als URL-GET-Parameter in den Abfragestring Ihres SRC-Ziels, 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-Analyse-Funktion, die die URL-Zeichenfolge analysiert, um die URL-Variable zu erhalten, nach der Sie suchen. In diesem Fall ist es "URL".

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

45
Gregory Lewis

Wenn Ihr iframe aus einer anderen Domäne stammt (domänenübergreifend), müssen Sie einfach Folgendes verwenden:

var currentUrl = document.referrer;

und - hier haben Sie die Haupt-URL!

27
ParPar

Für Seiten auf derselben Domain und unterschiedlichen Subdomains können Sie die document.domain -Eigenschaft über Javascript festlegen.

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

das heißt, __ .. _www.foo.mydomain.com und api.foo.mydomain.com könnten jeweils entweder foo.mydomain.com oder nur mydomain.com verwenden und kompatibel sein (nein, Sie können nicht beide auf com setzen, aus Sicherheitsgründen ...)

beachten Sie auch, dass document.domain eine Einbahnstraße ist. Führen Sie die folgenden drei Anweisungen in der angegebenen Reihenfolge 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 Herkunft zu kommunizieren, aber es funktioniert nicht in IE6 . https://developer.mozilla.org/en/DOM/window.postMessage

16
user409021

Die folgende Zeile wird funktionieren: document.location.ancestorOrigins[0] Dieser gibt den Vorfahrdomänennamen zurück.

3

Versuch es:

document.referrer

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

Ich hatte Probleme damit. Wenn Sie eine Sprache wie php verwenden, wenn Ihre Seite zum ersten Mal in den iframe grab $_SERVER['HTTP_REFFERER'] geladen wird, wird eine Sitzungsvariable festgelegt.

Wenn die Seite in den Iframe geladen wird, kennen Sie die vollständige übergeordnete URL und die Abfragezeichenfolge der Seite, die sie geladen hat. Mit Cross-Browser-Sicherheit ist es ein bisschen Kopfzerbrechen, wenn Sie auf window.parent alles zählen, wenn Sie verschiedene Domains verwenden.

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

Ich habe festgestellt, dass das oben genannte Beispiel zuvor funktioniert hat, als das Skript in einem Iframe ausgeführt wurde. Die URL konnte jedoch nicht abgerufen werden, wenn 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;
2
user3523340

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 führte. 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, nicht zu Ihrer Seite.

1
TARKUS

Ich konnte die vorherige Lösung nicht zum Laufen bringen, aber ich fand heraus, dass ich, wenn ich das iframe scr mit zum Beispiel http:otherdomain.com/page.htm?from=thisdomain.com/thisfolder eingestellt habe, im iframe-Extrakt thisdomain.com/thisfolder mithilfe des folgenden Javascript:

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

Ich habe in den Fällen, in denen $_SERVER['HTTP_REFERER'] nicht funktioniert (ich schaue Sie, Safari), festgestellt, dass $_SERVER['REDIRECT_SCRIPT_URI'] eine nützliche Sicherung ist.

1
Dan

In Chrome können Sie location.ancestorOrigins verwenden. Es werden alle übergeordneten URLs zurückgegeben 

0
Gena Moroz

Ich weiß, dass er sehr alt ist, aber es macht mich wahnsinnig. Niemand hat empfohlen, nur Cookies von einer Domain zur anderen zu übertragen. Wenn Sie Unterdomänen verwenden, können Sie Cookies von einer Basisdomäne für alle Unterdomänen freigeben, indem Sie Cookies auf die URL .basedomain.com setzen.

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

0
Bruce