iframe页面可以告诉他们何时被iframed?

时间:2009-10-02 13:21:31

标签: iframe same-origin-policy

所以我知道,如果我将iFrame包含在不在同一个域的页面上,我就无法通过浏览器策略访问iframe的DOM,但是iframe中的页面可以进行任何类型的父文档访问?

具体而言,我必须根据这个问题提出想法:

  1. 如果嵌入页面可以告诉它不是父窗口,那么可以创建任何非iframe的站点,这样如果页面检测到它是iframed,它就会变为“Go Away”页面或者你可以使它只有iframe-able(类似于服务器端脚本只适用于包含的页面),所以当它没有iframed时进入页面会得到一个“Go Away”页面。

  2. 如果iframed页面具有父窗口没有的某些自由,它可以请求父窗口的样式表并将其设置为样式表上的样式表,从而使站点与父文档集成更多。 (当然,我可以让我的样式表更多地与iframed网站有关,知道它会做到这一点,但我不认为这是一个问题。)

  3. 有人知道吗?

4 个答案:

答案 0 :(得分:11)

关于#1,是的,您可以使用一些简单的javascript来判断您是否正在构建框架:

<script type="text/javascript">
if (self != top)
{
  // Framed!
}
</script>

关于#2,我不确定你可以使用“top”变量做什么,但我知道你可以改变它的位置(所以如果你的网站被另一个网站框起来,你可以改变你的框架顶部框架的位置 - 基本上将用户直接重定向到您的站点)。

不确定您可以或不能对顶部框架做什么 - 其他人可能会在那里提供更多信息。

答案 1 :(得分:4)

您可能也会对this Coding Horror article感兴趣检测帧。您可以检测是否已经陷害,但也有“父”页面可以采取的对策,以防止您对此采取行动。文章中的例子:

检测你是否被诬陷:

if (parent.frames.length > 0) {
    top.location.replace(document.location);
}

阻止帧检测和重定向:

   var prevent_bust = 0  
   window.onbeforeunload = function() { prevent_bust++ }  
   setInterval(function() {  
     if (prevent_bust > 0) {  
       prevent_bust -= 2  
       window.top.location = 'http://server-which-responds-with-204.com'  
     }  
   }, 1)  

答案 2 :(得分:1)

这可以通过在页面中嵌入以下JavaScript来实现:

if(top.location.href != self.location){
//do redirection or display message
}

您可以将此Javascript作为网站模板的一部分,并阻止任何网页在IFrame中显示

答案 3 :(得分:0)

之前我已经完成了这项工作,并且已经有效:

<script type="text/javascript">
if (window.parent != null)
{
  // Framed!
}
</script>