【问题标题】:Frame breaking only cross-domain but not for iframes from the same origin?仅跨域破帧,但不适用于来自同一来源的 iframe?
【发布时间】:2011-04-18 22:36:10
【问题描述】:

这个问题之前asked and answered是正确的,但似乎没有发布解决方案。

如果一个网站有 iframe,并且想要防止它们被包含在来自不同域的框架中,那么简单的框架破坏将没有用:

<script>if (top != self) top.location = location</script>

但是,由于对其他域的跨框架脚本会产生异常,因此在 iframe 中似乎可以正常运行:

<script>
try {
  if (window.document.domain != top.document.domain) {   // throws exception
    throw "You naughty puppy!"; // Should not ever get here, right?
  }
}
catch () {
  top.location = "/error/naughtypuppy";
}
</script>

上面的 if 本身应该足以防止 iframe 的跨域框架。它应该只返回false 或抛出异常,那么脚本是否可以在浏览器中访问throw 语句?

这是否足以防止仅来自其他域的框架?

<script>
try {
  var bogus = top.document.domain;
}
catch () {
  top.location = "/error/naughtypuppy";
}
</script>

编辑:这里暗示了一个类似的解决方案,但不会依赖父框架来包含框架破坏代码。 Detect when iframe is cross-domain, then bust out of it 。基本上与“尝试访问其他框架并在发生异常时破坏”的解决方案相同。

【问题讨论】:

  • 啊,已经有答案了:stackoverflow.com/questions/2365822/…
  • 我之前评论中的答案并不完全有效。恶意代码在加载框架时不会包含onload="checkForCross()",因此最好在 child.html 页面而不是父框架中包含 checkForCross 函数。
  • 我想我会认为我的解决方案是正确的。

标签: javascript iframe same-origin-policy


【解决方案1】:

我的网站仍然有框架,我暂时无法删除它们。这是我能找到的最佳解决方案:

<style>html { display:none }</style>
<script>
if (self == top) {
  document.documentElement.style.display = 'block';
} else {
  top.location = self.location;
}
</script> 

来自此链接:XFS 101-cross-frame-scripting-explained

基于来自OWASP_AppSec_Research_2010_Busting_Frame_Busting_by_Rydstedt的演示文稿

这里是更新的 OWasp Clickjacking page

【讨论】:

  • 这不是问题的答案。他问如何在允许同源的同时防止跨源框架。
【解决方案2】:

该代码容易受到利用“onbeforeunload”功能的某种形式的攻击。父(邪恶)页面设置了一个间隔处理程序(由于域差异,它对您的代码无懈可击)和一个“onbeforeunload”处理程序。第二个处理程序只是更新一些全局变量(也是无懈可击的)以记录窗口“受到攻击”的事实,然后是间隔计时器(运行得足够快,以至于它应该能够在浏览器完成外部窗口之前变为活动状态update to your 合法 URL)弹出并更新 window.location 以指向一些攻击者控制的 URL,该 URL 返回 no-op 204 响应。浏览器忘记了您的 HTTP 请求,而是从间隔处理程序发起的较新事务中“更新”窗口。

这是较旧的 SO 问题:Frame Buster Buster ... buster code needed

【讨论】:

  • 啊,所以修复不会尝试设置位置。相反,可以只打开一个安全警报,用户当然会忽略它。
  • 但我认为上面的错误检查是正确的(var bogus = top.document.domain;)。与简单化解决方案(OWASP's)一样,只有处理容易受到影响。
  • 是的,这里的代码没有问题。还应该注意的是,在该攻击中利用的浏览器行为可能很容易在某些时候在现代浏览器中修复(如果还没有的话;我无法让 Chrome 屈服于这一点,但我不确定我是做对了)。
  • 不过,我还是感谢您指出 onbeforeunload 巫术。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
  • 2014-11-28
  • 2019-02-17
相关资源
最近更新 更多