Unsicheren JavaScript-Versuch zu initiieren, die navigation für Rahmen mit URL
Dies ist ein bisschen kompliziert, bitte Geduld mit mir.
Website a hat Einen iframe enthält, website B und website B hat ein iframe enthalten website C.
Gibt es eine Schaltfläche auf der website von C, wenn geklickt haben, ich will aktualisieren Sie die url der website B. unten wird das javascript aufgerufen, um die Aktualisierung von website B, website C, welche in einem iframe
function url_update(id){
var host = 'https://websiteb.com ';
var myHost = host.split('/');
if (id != "" && myHost != ""){
try {
if (id.substring(0,1) != '/'){
id = '/' + id;
}
var dft_url = myHost[0] + '//' + myHost[2] + id;
window.parent.location.href = dft_url;
} catch(e){alert("Cannot go to the desired url location: " + dft_url);}
}
}
aber, wenn die Zeile "Fenster.Eltern.Lage.href = dft_url;" ausgeführt wird, erhalte ich die folgende Fehlermeldung:
Unsafe JavaScript attempt to initiate navigation for frame with URL
'https://websiteB.com' from frame with URL
'https://websiteC.com'. The frame attempting navigation is
neither same-origin with the target, nor is it the target's parent or
opener.
Ich verstehe nicht, warum das passiert und wie man es beheben. Jede Hilfe wird geschätzt.
Habe ich einige der Forschung, die meisten behaupteten das ist ein origin-problem, aber wenn ich Eine website, was bedeutet, dass nur website B mit einem iframe enthält, website C, dann ist der obige code funktioniert. Auch wenn Sie unterschiedliche domains
- Möglicherweise möchten Sie
c
eine Seite inb
machen es zu einem Teilb
... - Sie werden nicht in der Lage, das zu tun, wenn die Domänen unterschiedlich sind, schauen Sie in HTML5-messaging-api. developer.mozilla.org/en-US/docs/Web/API/Window/postMessage Mit dieser api können Sie das annehmen von Nachrichten von Websites mit verschiedenen domains und ausführen von JS basierend auf der Nachricht, die z.B. durch eine änderung die url der Seite, von der die Nachricht empfangen hat.
- brso05: ich kann das nicht, ich mache keine eigene website B, oder A, ich habe nur Zugriff auf website-C. Dies ist der Grund, warum C in einem iframe einbetten in B.
- gibt es eine Möglichkeit zu überprüfen, was der Wert von window.übergeordnete website C, ist es website A oder website B?
- meinst du wie Fenster.Eltern.Lage.href? nicht ganz sicher, was du meinst mit dem Wert
- Ich habe die gleiche Sache erlebt, getestet in Chrome 44. Was interessant ist, dass C tatsächlich erlaubt, ändern Sie die Position der oberen Fenster zu tun Fenster.top.Lage.href = "blahblah" auch wenn Website A und C sind cross-domain. Ich verstehe nicht, warum iframe-C navigieren Sie in dem oberen Fenster, aber nicht iframe-B.
- in der Tat ein iframe ändern Sie die url des obersten Fensters, aber das ist eher verwunderlich (obwohl Sie blockieren kann dieses Verhalten durch das sandboxing der iframe). Wenn C auf einer anderen domain als B und A, und
postMessage
ist nicht eine option, dann ist sicherlich C ist nicht in der Lage zu ändern, B ' s Position.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Finden Sie eine Erklärung für dieses Verhalten in einem Kommentar von der Chromium-Quellcode. Siehe hier:
https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/core/frame/Frame.cpp&sq=package:chromium&rcl=1438193817&type=cs&l=202
Grundsätzlich top-level-windows haben weniger Einschränkungen in Bezug auf navigation als die anderen windows. Siehe Einschränkungen für nicht top windows:
Wo, wie für top-Fenster:
Grund dafür ist:
Also im Grunde, für ein nicht-top-Fenster, es muss absolut sein, gleiche Herkunft zu ermöglichen, die navigation, aber für top-Fenster, ein Rahmen, der eröffnet wurde durch das Fenster navigieren können, auch wenn es nicht gleichen Ursprungs. Das scheint das problem zu sein, die Sie gegenüberstellen, wenn B ist top, die same-origin-nicht anwenden, aber wenn es nicht von oben, dann gilt es.
Nach diesem, ich bin nicht sicher, es ist eine einfache, oder überhaupt, Lösung.