不安全的JavaScript尝试使用URL启动框架导航

Noo*_*der 9 html javascript security iframe jquery

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

网站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);}
   } 
 }
Run Code Online (Sandbox Code Playgroud)

但是当行"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.
Run Code Online (Sandbox Code Playgroud)

我不明白为什么会发生这种情况以及如何解决这个问题.任何帮助将不胜感激.

我做了一些研究,大多数人声称这是一个原始问题,但是如果我拿出网站A,意思是网站B只有一个包含网站C的iframe,那么上面的代码就可以了.即使他们有不同的域名

Jul*_*ire 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

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

文档可以导航其后代帧,或者更一般地,如果文档与任何帧的祖先(在帧层次结构中)处于相同的原点,则文档可以导航帧.

顶窗:

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

原因是:

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

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

据此,我不确定是否有直截了当或完全没有解决方案.