3

这个问题以前被问过并正确回答,但似乎没有发布解决方案。

如果一个站点有 iframe,并且想要防止这些 iframe 被包含在来自不同域的框架中,那么简单的 frame-busting 将没有用:

<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>

编辑:这里暗示了一个类似的解决方案,但不会依赖父框架来包含破坏框架的代码。检测 iframe 何时是跨域的,然后退出它。本质上与“尝试访问其他框架并在发生异常时破坏”相同的解决方案。

4

2 回答 2

2

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

这是较旧的 SO 问题:Frame Buster Buster ... 需要 buster 代码

于 2010-11-15T17:08:18.353 回答
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 页面

于 2014-10-02T21:21:03.980 回答