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

Posted

技术标签:

【中文标题】不安全的 JavaScript 尝试使用 URL 启动框架导航【英文标题】:Unsafe JavaScript attempt to initiate navigation for frame with URL 【发布时间】:2015-09-25 00:34:00 【问题描述】:

这有点复杂,请多多包涵。 网站 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.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,那么上面的代码就可以工作。即使他们有不同的域

【问题讨论】:

您可能希望将c 设为b 中的一个页面,使其成为b 的一部分... 如果域不同,您将无法做到这一点,请查看 html5 消息传递 API。 developer.mozilla.org/en-US/docs/Web/API/Window/postMessage 使用这个 api,你可以接受来自不同域的站点的消息,并根据消息运行 JS,例如修改接收消息页面的url。 @brso05:我做不到,我没有自己的网站B,或者A,我只能访问网站C。这就是C在iframe中嵌入B的原因。跨度> @user2879041: 有没有办法检查网站 C 的 window.parent 的值是多少,是网站 A 还是网站 B? @JayChen 你的意思是像 window.parent.location.href 吗?不太清楚你所说的价值是什么意思 【参考方案1】:

您可以在 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 位于顶部时,同源不适用,但当它不是顶部时,则适用。

据此,我不确定是否有直接的解决方案或任何解决方案。

【讨论】:

【参考方案2】:

我知道这个老,但我来这里是因为我有同样的问题。我在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);

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

【讨论】:

以上是关于不安全的 JavaScript 尝试使用 URL 启动框架导航的主要内容,如果未能解决你的问题,请参考以下文章

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

在 Chrome webkit 检查器中不断生成“不安全的 JavaScript 尝试使用 URL 访问框架...”错误

不安全的 JavaScript 尝试使用框架访问

你不知道的事Javascript 中一种更安全的 URL 读写方式

使用 iframe 嵌入 Youtube 视频会给出“不安全的 JavaScript 尝试......”

加载 URL svg 的不安全尝试