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


112

当我尝试从包含另一个域URL的iframe设置哈希值到父URL时,出现以下错误:

不安全的JavaScript尝试从URL为“ URL2”的框架访问URL为“ URL1”的框架。域,协议和端口必须匹配。

我该如何解决这个问题?


3
请添加更多的细节,代码片段,错误消息,框架您使用。更冗长,更多的细节..
fifigyuri

5
当您实现g + 1,facebook like or shre和twitter社交插件(加载到iframe中并抛出相同错误)时,该怎么办?

问题是,为什么Facebook和Google脚本甚至试图访问我的网站元素。
塞尔吉奥2014年

Answers:


124

从不同来源的子文档中,您不能访问顶部窗口的location.hash属性,但可以设置location属性本身。

这意味着给定顶部窗口的位置是http://example.com/page/,而不是

parent.location.hash = "#foobar";

你确实需要知道父母的位置并做

parent.location = "http://example.com/page/#foobar";

由于未导航资源,因此它将按预期工作,仅更改URL的哈希部分。

如果您正在使用它进行跨域通信,那么我建议您改用easyXDM


13
没有人将其标记为答案,但它有60票赞成票。为此应该有一个徽章。
zachzurn

35
徽章将被称为什么?“回应一个懒惰的人”
nzifnab

1
嘿@atul,请客气并将此答案标记为最佳答案。遵守使我们所有人都能从他人的知识中受益的公约……
克林特·伊斯特伍德

13

如果两个框架具有不同的域->安全性,则无法进行跨框架脚本编写。

看到这个:http : //javascript.about.com/od/reference/a/frame3.htm

现在回答您的问题:没有解决方案或解决方法,您只需要检查您的网站设计,为什么必须有来自不同域的两个框架会更改另一个框架的URL。


82
在将第三方应用程序嵌入到您的网站中时,这是一个常见的要求,尤其是在无法选择Web服务等的情况下。
雅克,

9

当我尝试对iframe.src的域进行填充时,我得到了相同的错误消息。

对我来说,答案是将iframe.src更改为SAME域上的url,但这实际上是指向所需域的html重定向页面。另一个域随后出现在我的iframe中,没有任何错误。

像魅力一样工作。:)


您能否详细说明一下您在这里所做的事情?
Devin G Rhode

如果您可以简要解释,那将非常有帮助。
Madhusudhan

2
在最新版本的Chrome中不起作用:它不会检查src参数,但会加载实际的URL。因此,不幸的是,重定向技巧无济于事:-(
lucaferrario 2012年


那很整齐。但这只是说明解决此问题的一般程度。好的,假设我是一个邪恶的恶意黑客,并且我想运行跨域脚本攻击。我将有机会了解并使用这些工具。至于浏览器的安全修复程序,这很容易受到IE的阻碍,因为IE不允许您在没有警告的情况下在本地运行Javascript。解决没有问题。创建一堆新的。
伊扎克

6

一种解决方案是使用本地文件来检索远程内容

remoteInclude.php

<?php
$url = $_GET['url'];
$contents = file_get_contents($url);
echo $contents;

HTML

<iframe frameborder="1" id="frametest" src="/remoteInclude.php?url=REMOTE_URL_HERE"></iframe>
<script>
    $("#frametest").load(function (){       
    var contents =$("#frametest").contents();
});


1
这为跨站点脚本漏洞打开了大门。 可能的攻击示例: 1. 我在myevilserver.com上创建了一个与您的网站类似的页面,包括一个登录表单,该页面回发到myevilserver.com。2 . 我向您的用户发送了一封虚假的通讯,并带有指向以下内容的链接: https:// yoursite.com/remoteInclude.php?url=myevilserver.com 3. 他们看到您在我的服务器上捕获的您网站上的登录表单。
EricP

2
一种可能的解决方案是使remoteInclude.php根据预先批准的域列表检查所有url。
EricP

这不能解决跨站点脚本漏洞问题。我绝对无法使用Javascript来访问服务器上无法访问的外部网站。所有这一切都阻碍了浏览器本身,并通过引入额外的步骤使Web应用程序的使用率降低。如果您通过ajax加载,重写链接并回发,您仍然可以做所有这些事情。如果那不起作用,请通过php或其他语言远程rpc。荒谬的是,这甚至对于普通编码器来说都是一个问题。
伊扎克

3

我发现使用XFBML版本的Facebook like按钮而不是HTML5版本解决了此问题。将以下代码添加到您希望按钮出现的位置:

<div id="fb-root"></div>
<script>(function (d, s, id) {
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) return;
    js = d.createElement(s); js.id = id;
    js.src = "//connect.facebook.net/en_GB/all.js#xfbml=1";
    fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>

<fb:like send="true" layout="button_count" width="50" show_faces="false" font="arial"></fb:like>

然后将其添加到您的HTML标记中:

 xmlns:fb="http://ogp.me/ns/fb#"

2
Facebook与这个问题有什么关系?
Kukks 2012年

16
因为您在按钮之类的Facebook上也会遇到此错误,并且我在搜索答案时找到了此页面,所以以为其他人可能需要答案。
路加·阿德顿

1

问题是,即使您创建了代理或加载了内容并像本地一样将其注入,该内容定义的任何脚本也会从其他域加载,从而导致跨域问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.