为什么`onload`事件不会在带有framebusting的嵌套iframe上触发?

时间:2014-05-05 22:48:20

标签: javascript html security iframe framebusting

请考虑以下三页。

  1. Foo.html在浏览器中本地打开,因此具有前缀为file:///的网址。
  2. Bar.htmlFoo.html位于同一目录中。
  3. Bar2.html位于/var/www,我正在Apache上运行localhost
  4. Foo.html

    <html>
      <head>
      <script>
      foo = function() {
        alert("frame changed");
      };
      </script>
      </head>
    
      <body>
      <iframe width="200" height="300" src="Bar.html" id="my-iframe" onLoad="foo" /> 
      </body>
    </html>
    

    一个bar.html

    <html>
      <body>
      <iframe width="200" height="300" src="http://localhost/Bar2.html" id="my-iframe" /> 
      </body>
    </html>
    

    Bar2.html

    <html>
      <head>
      <script>
      if (top.location != self.location){
          parent.location = self.location;
      }
      </script>
      </head>
      <body>
      <button type="button" onclick="document.location.href='http://bing.com'">Hello World</button>
      </body>
    </html>
    

    在Firefox中加载Foo.html时,通过在命令行上运行firefox /path/to/Foo.htmlBar2.html中的帧破坏代码会突破Bar.html。此时,用户会收到警报frame changed

    当我点击按钮时,iframe更改(按钮消失),但我没有收到提醒。

    为什么onLoad在页面更改时第二次没有触发?

2 个答案:

答案 0 :(得分:1)

问题在于,当Bar.html中的iframe加载Bar2.html时,这个条件是假的

if (top.location != self.location)

因此,当Bar.html加载Bar2.html时,这称为

parent.location = self.location;

由于页面在技术上从未完成加载,因此会在页面中发出重定向并取消onload事件的影响。

答案 1 :(得分:0)

您的脚本

  if (top.location != self.location){
      parent.location = self.location;
  }

将在Bar2.htm上运行并更改其父级的位置(以前为Bar.htm)。然后警报来了。 然后,脚本将在父级(以前的Bar.htm)中运行,但top.location仍然不等于self.location。 (top.location现在等于Foo.htm,self.location等于Bar.htm)所以当你单击按钮时,父页面已被重定向到Bar2.htm。这意味着警报代码和iframe消失了。