不安全的 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 中一种更安全的 URL 读写方式