不安全的JavaScript尝试使用网址

时间:2015-07-07 13:30:03

标签: javascript jquery html security iframe

这有点复杂,请耐心等待。 网站A的iframe包含网站B,网站B的iframe包含网站C.

网站C上有一个按钮,点击后,我想刷新网站B的网址。下面是调用网页C的网站B刷新的javascript,这是在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.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只有一个包含网站C的iframe,那么上面的代码就可以了。即使他们有不同的域名

2 个答案:

答案 0 :(得分:11)

您可以在Chromium源代码的注释中找到有关此行为的说明。见这里:

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

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

  

文档可以导航其后代帧,或者更一般地,a   如果文档与原始文件相同,则文档可以导航   任何一个框架的祖先(在框架层次结构中)。

顶窗的位置:

  

具体而言,文档可以导航顶层框架(如果该框架)   打开文档或文档是同一个来源的任何一个   顶级框架的开启者的祖先(在框架层次结构中)。

原因是:

  

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

所以基本上,对于非顶部窗口,它绝对需要是相同的原点以允许导航,但对于顶部窗口,由该窗口打开的框架可以导航,即使它不是同源的。这似乎是你所面临的问题,当B是顶级的时候,同一个起源不适用,但是当它不是顶级时,则适用。

根据这一点,我不确定是否有直截了当或根本没有解决方案。

答案 1 :(得分:0)

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

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);

您可以从来源阅读更多信息:
Creating an iframe with given HTML dynamically
Frames and Windows