不安全的JavaScript试图为带有URL的框架启动导航

Unsafe JavaScript attempt to initiate navigation for frame with URL

本文关键字:URL 框架 导航 启动 JavaScript 不安全      更新时间:2023-09-26

这有点复杂,请耐心听我说。网站A有一个包含网站B的iframe,网站B有一个包含网站c的iframe。

在C网站上有一个按钮,当点击时,我想刷新B网站的url。下面是调用javascript从C网站刷新B网站,这是在一个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);}
   } 
 }

但是当"window.parent.location. location. "href = dft_url;"执行时,我收到以下错误:

 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.

我不明白为什么会发生这种情况以及如何解决它。任何帮助都将不胜感激。

我做了一些研究,大多数人声称这是一个起源问题,但如果我拿出网站A,这意味着只有网站B的iframe包含网站C,那么上面的代码工作。尽管它们有不同的域

您可以在Chromium源代码的注释中找到对该行为的解释。在这里看到的:

https://code.google.com/p/chromium/codesearch铬/src/third_party/WebKit/源/核心/框架/Frame.cpp&平方=包:chromium& rcl = 1438193817,类型= cs& l = 202

基本上顶层窗口对导航的限制比其他窗口少。请参阅非顶部窗口的限制:

一个文档可以导航它的子框架,或者,更一般地,一个如果文档位于同一原点,则文档可以导航框架该框架的任何祖先(在框架层次结构中)

顶窗:

具体来说,如果顶层框架已打开的文档,或者如果该文档与任何一个相同来源顶层框架的开启器的祖先(在框架层次结构中)。

原因是:

顶层框架比其他框架更容易导航,因为它们在地址栏中显示他们的url(在大多数浏览器中)。

基本上,对于非顶部窗口,它绝对需要同源才能允许导航,但对于顶部窗口,被那个窗口打开的框架可以导航即使它不是同源的。这似乎是你面临的问题,当B在顶部时,相同的原点不适用,但当它不在顶部时,它就适用。

根据这一点,我不确定是否有一个直接的或任何解决方案。

我知道这件事,但我来这里是因为我有同样的问题。我在iframe中使用sandbox属性解决了我的问题:

var iframe = document.createElement('iframe');
iframe.setAttribute("sandbox", "allow-scripts allow-top-navigation");
var html = '<body><script>window.top.location="https://redirectDomain.tld";</script></body>';
iframe.src = 'data:text/html;charset=utf-8,' + encodeURI(html);
document.body.appendChild(iframe);

你可以阅读更多来源:
用给定的HTML动态创建iframe
框架和Windows