帧巴斯特巴斯特 ...需要破坏者代码

2022-08-29 23:21:07

假设您不希望其他网站将您的网站“框架”在:<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难题而不是一个实际问题 - 你怎么能打败破坏框架的破坏者?

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

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

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


答案 2

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

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

单击此链接以解决此问题

不是最好的,但我看不出他们有任何办法可以解决这个问题。