假设你不希望其他网站在<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>

这段代码执行以下操作:

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

我的问题是——这更像是一个JavaScript难题,而不是一个实际问题——如何打败框架破坏破坏者?

我有一些想法,但在我的测试中没有什么管用:

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

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


当前回答

我想你已经差不多了。你有没有试过:

window.parent.onbeforeunload = null;
window.parent.location.replace(self.location.href);

或者,或者:

window.parent.prevent_bust = 0;

注意:我实际上并没有对此进行测试。

其他回答

我们在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>

我想你已经差不多了。你有没有试过:

window.parent.onbeforeunload = null;
window.parent.location.replace(self.location.href);

或者,或者:

window.parent.prevent_bust = 0;

注意:我实际上并没有对此进行测试。

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

您正在未经授权的框架窗口中查看此页面- (Blah Blah…潜在的保安问题) 单击此链接可修复此问题

不是最好的,但我不认为他们可以通过剧本来解决这个问题。

使用htaccess来避免帧集,iframe和任何像图像这样的内容。

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://www\.yoursite\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule ^(.*)$ /copyrights.html [L]

这将显示一个版权页面,而不是预期的页面。

在思考了一段时间后,我相信这会让他们知道谁才是老大……

if(top != self) {
  window.open(location.href, '_top');
}

使用_top作为window.open()的目标参数将在同一窗口中启动它。