检测iframe何时是跨域的,然后突破它

时间:2010-03-02 18:54:59

标签: javascript security iframe cross-domain

我有一个包含大量iframe的页面,其中包含大部分内容。用户通过在iframe中单击来与网站进行交互。我正在尝试构建的功能是:当用户离开我的网站时,我帮他们做了一个忙,然后退出了iframe。

iframe有一个onload事件,每次加载新页面时都会触发该事件,不管是否跨域。

<iframe id="testframe" src="http://mysite.com" onload="testframe_loaded()"></iframe>

每次事件发生时,我都在寻找一些方法:

A )检测用户何时导航到其他域

B )从iframe中冲出来。

我怀疑B是不可能的,因为浏览器不允许访问

document.getElementById("testframe").contentDocument.location.href
iframe是跨域的。我也不确定A是否可能。

如果有人对如何实现这一点有所了解,或者对于无法做到这一点持积极态度,我会很感激这些建议。

由于

3 个答案:

答案 0 :(得分:8)

你可以做A,因为如果你得到一个安全错误(你可以捕获),这意味着他们是跨域:)然后你可以调整iframe的大小作为整个页面。但是,如果没有来自其他领域的明确合作,我认为你是对的,你实际上不能破产。

编辑:你是对的,你不需要民意调查。这是基本代码:

<html>
<head>
<title>Cross-domain frame test</title>
<!-- http://stackoverflow.com/questions/2365822/detect-when-iframe-is-cross-domain-then-bust-out-of-it/2365853#2365853 -->
<script type="text/javascript">
function checkForCross()
{
  var iframe = document.getElementById("myFrame");
  try
  {
    var loc = iframe.contentDocument.location.href;
  } catch(e)
  {
    iframe.setAttribute("style", "border: 0; margin: 0; padding: 0; height: 100%; width: 100%;");
  }
}
</script>
</head>
<body>
<iframe name="myFrame" id="myFrame" src="child.html" style="height: 50%; width: 50%;" onload="checkForCross()"></iframe>
</body>
</html>

答案 1 :(得分:2)

将外部链接上的'target'属性设置为'_top'。

答案 2 :(得分:1)

这至少适用于chrome(不是其他浏览器的测试人员)

   if(parent.location.host != undefined){ 
       alert("hello world!");
    }else{
       throw "cannot access parent!";
    }

它仍会抛出"unsafe javascript attempt"警告,但这并不会阻止代码执行。而是将变量返回为undefined。