不安全的 JavaScript 尝试使用 URL 访问框架
Posted
技术标签:
【中文标题】不安全的 JavaScript 尝试使用 URL 访问框架【英文标题】:Unsafe JavaScript attempt to access frame with URL 【发布时间】:2011-05-18 11:15:59 【问题描述】:当我尝试从包含另一个域 url 的 iframe 为父 url 设置哈希值时,出现以下错误:
不安全的 javascript 尝试从 URL 为“URL2”的框架访问 URL 为“URL1”的框架。域、协议和端口必须匹配。
我该如何解决这个问题?
【问题讨论】:
请添加更多详细信息、代码 sn-ps、错误消息、您使用的框架。更多详细信息,更多详细信息.. 当您实现 g+1、facebook like 或 shre 和 twitter 社交插件时会怎样?这些插件会在 iframe 中加载并引发相同的错误? 问题是为什么 Facebook 和 Google 脚本甚至试图访问我的网站元素。 【参考方案1】:您不能从不同来源的子文档访问顶部窗口的location.hash
属性,但您可以设置location
属性本身。
这意味着假设顶部窗口位置是http://example.com/page/
,而不是这样做
parent.location.hash = "#foobar";
你确实需要知道父母的位置并做
parent.location = "http://example.com/page/#foobar";
由于资源未导航,这将按预期工作,只需更改 url 的哈希部分。
如果您使用它进行跨域通信,那么我建议您改用easyXDM。
【讨论】:
没有人将此标记为答案,但它有 60 个赞。应该有一个徽章。 徽章叫什么? “回应一个懒惰的人” 嘿@atul,请善待并将此答案标记为最佳答案。尊重允许我们所有人从他人的知识中受益的惯例......【参考方案2】:当两个框架具有不同的域时,跨框架脚本是不可能的 -> 安全性。
看到这个:http://javascript.about.com/od/reference/a/frame3.htm
现在回答您的问题:没有解决方案或解决方法,您只需检查您的网站设计,为什么必须有两个来自不同域的框架会更改另一个的 url。
【讨论】:
当您将第三方应用程序嵌入您的网站时,这是一种常见的要求,尤其是在无法选择网络服务等的情况下。【参考方案3】:当我尝试更改 iframe.src 的域时,我收到了相同的错误消息。
对我来说,答案是将 iframe.src 更改为同一域上的 url,但这实际上是指向所需域的 html 重定向页面。然后另一个域出现在我的 iframe 中,没有任何错误。
工作就像一个魅力。:)
【讨论】:
您能否详细说明您在这里做了什么? 如果你能简单解释一下会很有帮助。 在最新的 Chrome 中不起作用:它不检查 src 参数,但实际加载了 URL。所以不幸的是,重定向技巧没有任何帮助:-( 我相信 Tommy 指的是服务器端代理。参见例如benalman.com/projects/php-simple-proxy 或 developer.yahoo.com/javascript/howto-proxy.html 或 google.com/… 或 René de Kat 的解决方案***.com/a/11224975/27938 这很好。但这只是说明了解决这个问题通常是多么微不足道。好的,假设我是一个邪恶的恶意黑客,我想运行跨域脚本攻击。我有机会了解这些工具并使用它们。就浏览器安全修复而言,这就像 IE 不允许您在没有警告的情况下在本地运行 Javascript 一样容易受到阻碍。解决不了问题。创建一堆新的。【参考方案4】:一种解决方案是使用检索远程内容的本地文件
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.我在 myevilserver.com 上创建了一个页面这看起来就像您的网站,包括一个 POST 回 myevilserver.com 2. 的登录表单。我向您的用户发送了一份虚假的时事通讯,其中包含指向 https://yoursite.com/remoteInclude 的链接。 php?url=myevilserver.com 3. 他们在您的网站上看到了我在服务器上捕获的登录表单。 一种可能的解决方案是让 remoteInclude.php 根据预先批准的域列表检查所有 url。 这并不能解决跨站脚本漏洞问题。对于外部网站,我绝对不能用 Javascript 做任何事情,而我不能从服务器端做这些事情。所有这一切都会阻碍浏览器本身,并通过引入额外的步骤使 Web 应用程序变得不那么有用。如果您通过 ajax 加载、重写链接并回发,您仍然可以完成所有这些工作。如果这不起作用,请通过 php 或任何语言对其进行远程 rpc。对于普通的程序员来说,这甚至是一个问题,这很荒谬。【参考方案5】:我发现使用 Facebook 赞按钮的 XFBML 版本而不是 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" show_faces="false" font="arial"></fb:like>
然后将其添加到您的 HTML 标记中:
xmlns:fb="http://ogp.me/ns/fb#"
【讨论】:
Facebook 和这个问题有什么关系? 因为你在 facebook 上也遇到了这个错误,比如按钮,我在搜索答案时发现了这个页面,所以认为其他人可能需要答案。【参考方案6】:问题是即使您创建代理或加载内容并将其注入本地,该内容定义的任何脚本都将从其他域加载并导致跨域问题。
【讨论】:
以上是关于不安全的 JavaScript 尝试使用 URL 访问框架的主要内容,如果未能解决你的问题,请参考以下文章
不安全的 JavaScript 尝试使用 URL 启动框架导航
在 Chrome webkit 检查器中不断生成“不安全的 JavaScript 尝试使用 URL 访问框架...”错误
你不知道的事Javascript 中一种更安全的 URL 读写方式