Frame Buster Buster ...需要buster代码

IT技术 javascript html iframe framebusting
2021-02-02 08:19:42

假设您不希望其他网站在以下位置“构建”您的网站<iframe>

<iframe src="http://example.org"></iframe>

因此,您将反框架、框架破坏 JavaScript 插入到所有页面中:

/* break us out of any containing iframes */
if (top != self) { top.location.replace(self.location.href); }

优秀!现在您可以自动“破坏”或突破任何包含 iframe 的内容。除了一个小问题。

事实证明,您的帧破坏代码可以被破坏如下所示

<script type="text/javascript">
    var prevent_bust = 0  
    window.onbeforeunload = function() { prevent_bust++ }  
    setInterval(function() {  
      if (prevent_bust > 0) {  
        prevent_bust -= 2  
        window.top.location = 'http://example.org/page-which-responds-with-204'  
      }  
    }, 1)  
</script>

此代码执行以下操作:

  • 每次浏览器尝试通过window.onbeforeunload事件处理程序导航离开当前页面时都会增加一个计数器
  • 通过 设置一个每毫秒触发一次的计时器,setInterval()如果它看到计数器增加,则将当前位置更改为攻击者控制的服务器
  • 该服务器提供一个带有 HTTP 状态代码204的页面,这不会导致浏览器导航到任何地方

我的问题是——这更像是一个 JavaScript 难题而不是一个实际问题——你怎么能打败破坏框架的破坏者?

我有一些想法,但在我的测试中没有任何效果:

  • 试图通过清除onbeforeunload事件onbeforeunload = null没有效果
  • 添加alert()停止进程让用户知道它正在发生,但不会以任何方式干扰代码;单击“确定”让破坏继续正常进行
  • 我想不出任何清除setInterval()计时器的方法

我不是一个 JavaScript 程序员,所以这是我对你的挑战:嘿,破坏者,你能破坏框架破坏者吗?

6个回答
或者将此与此页面上 12 月 12 月的答案结合起来:stackoverflow.com/a/13708510/328397
2021-03-16 08:19:42
非常好,在浏览器 .exe 中支持这一点毫无疑问是要走的路。当您说“大多数浏览器”时,具体是哪些?除了 IE8,我找不到任何好的资源。
2021-03-29 08:19:42
这是一个测试页面:enhanceie.com/test/clickjackChrome 4.1.249.1042 支持。Opera 10.50 支持。Firefox 3.6.2 尚不支持。Safari 4.0.3 支持。
2021-04-01 08:19:42
最好将其与 javascript framebuster 结合使用。
2021-04-01 08:19:42
Firefox 3.6.9将原生支持它(hackademix.net/2010/08/31/...),并且自 2009 年初以来,任何使用 NoScript 安装的Firefox 都支持它hackademix.net/2009/01/29/x-frame- Firefox 中的选项
2021-04-06 08:19:42

我不确定这是否可行 - 但如果你不能打破框架,为什么不只显示一个警告。例如,如果您的页面不是“首页”,则创建一个尝试打破框架的 setInterval 方法。如果尝试 3 或 4 次后,您的页面仍然不是首页 - 创建一个 div 元素来覆盖整个页面(模态框),并带有一条消息和一个链接,例如...

您正在未经授权的框架窗口中查看此页面 - (等等……潜在的安全问题)

单击此链接以解决此问题

不是最好的,但我看不出他们有什么办法可以摆脱这种情况。

另一个想法是用类似的东西完全擦除页面document.write("");(在你确定它被框起来之后
2021-03-16 08:19:42
这不仅是避免滥用的好方法,而且对于可能想要 iframe 您的网站只是为了看一眼但不允许使用它的网站非常友好。理想情况下,我认为应该使用网站主页的屏幕截图,并解释为什么不能在覆盖在顶部的 iframe 中使用它。
2021-03-24 08:19:42
Facebook就是这样做的。
2021-03-27 08:19:42
我试过这个,这有效。我喜欢这个解决方案的另一个方面是它让用户了解他/她在访问您的内容之前他/她所在的网站类型。示例代码: if (parent.frames.length > 0) { top.location.replace(document.location); setTimeout(function() { if (parent.frames.length > 0) { document.location = " google.com "; } }, 10); }
2021-03-29 08:19:42
但也许这可以被利用,如果破坏站点反过来会创建一个虚假的反反反......(不知道我们现在有多少反抗)灯箱 div 为自己呈现一个网络钓鱼链接或其他什么...... tbc
2021-04-05 08:19:42

我们在来自http://seclab.stanford.edu/websec/framebusting/framebust.pdf的网站之一中使用了以下方法

<style>
 body { 
 display : none   
}
</style>
<script>
if(self == top) {
document.getElementsByTagName("body")[0].style.display = 'block';
}
else{
top.location = self.location;
}
</script>
应该选择这个答案或我的答案:)
2021-03-12 08:19:42
我喜欢你同时使用这个和 X-Frame-Options:deny 答案的想法。
2021-03-14 08:19:42
答对了!不知道为什么这没有得到更多的支持,因为它是最佳答案(在 X-Frame-Options 答案旁边,但最好将两者结合起来)
2021-03-31 08:19:42
+1 - 这是无法使用 X-FRAME-OPTIONS 时的最佳答案。(例如,当您需要根据推荐人有条件地允许或拒绝时。)
2021-03-31 08:19:42
这需要 JS,恕我直言,这是一个相当大的负担。
2021-04-06 08:19:42

想出了这个,它似乎至少在 Firefox 和 Opera 浏览器中工作。

if(top != self) {
 top.onbeforeunload = function() {};
 top.location.replace(self.location.href);
}
Jani 和 Jeff 的解决方案(一旦编辑)都是正确的,并且工作等效;给 Jani 接受,因为他的解决方案无需任何编辑即可正常工作
2021-03-11 08:19:42
如果涉及嵌套框架,则必须遍历框架链并删除所有onbeforeunload处理程序,而不仅仅是顶部的处理程序!
2021-03-12 08:19:42
这仅在两个窗口属于同一域时才有效;当您想从框架中逃脱时,这种情况很少发生。
2021-03-14 08:19:42
重要说明:这对我有用,因为 iframe src= 是动态设置的,因此跨域策略无效。JP 绝对正确,在静态 src= 中这是行不通的。
2021-03-25 08:19:42
好的,现在有人可以想出一个框架克星克星克星吗?
2021-03-30 08:19:42

考虑到当前为 iframe 引入沙箱的 HTML5 标准,当攻击者使用沙箱时,可以禁用此页面中提供的所有框架破坏代码,因为它限制了 iframe 执行以下操作:

allow-forms: Allow form submissions.
allow-popups: Allow opening popup windows.
allow-pointer-lock: Allow access to pointer movement and pointer lock.
allow-same-origin: Allow access to DOM objects when the iframe loaded form same origin
allow-scripts: Allow executing scripts inside iframe
allow-top-navigation: Allow navigation to top level window

请参阅:http : //www.whatwg.org/specs/web-apps/current-work/multipage/the-if​​rame-element.html#attr-iframe-sandbox

现在,考虑攻击者使用以下代码在 iframe 中托管您的站点:

<iframe src="URI" sandbox></iframe>

然后,所有 JavaScript 框架破坏代码都将失败。

在检查所有帧总线代码后,只有这种防御在所有情况下都有效:

<style id="antiClickjack">body{display:none !important;}</style>
<script type="text/javascript">
   if (self === top) {
       var antiClickjack = document.getElementById("antiClickjack");
       antiClickjack.parentNode.removeChild(antiClickjack);
   } else {
       top.location = self.location;
   }
</script>

最初由Gustav Rydstedt、Elie Bursztein、Dan Boneh 和 Collin Jackson 提出(2010 年)