假设您不希望其他网站在<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 = null清除onbeforeunload事件没有任何效果
  • 添加一个alert()停止进程让用户知道它正在发生,但没有以任何方式干扰代码; 单击“确定”可以正常继续进行破坏
  • 我想不出任何方法来清除setInterval()计时器

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


#1楼

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

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

单击此链接以解决此问题

不是最好的,但我认为他们没有任何方式可以编写出自己的方式。


#2楼

经过一段时间的思考后,我相信这会告诉他们谁是老板......

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

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


#3楼

所有提出的解决方案直接强制改变顶部窗口的位置。 如果用户希望框架在那里怎么办? 例如,搜索引擎的图像结果中的顶部框架。

我写了一个原型,默认情况下所有输入(链接,表单和输入元素)都被禁用和/或在激活时不执行任何操作。

如果检测到包含框架,则会禁用输入,并在页面顶部显示警告消息。 警告消息包含一个链接,该链接将在新窗口中打开页面的安全版本。 这可以防止页面用于点击劫持,同时仍允许用户在其他情况下查看内容。

如果未检测到包含帧,则启用输入。

这是代码。 您需要将标准HTML属性设置为安全值,并添加包含实际值的附加属性。 它可能是不完整的,并且对于完全安全的附加属性(我正在考虑事件处理程序)可能必须以相同的方式处理:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html><head><title></title><script><!--function replaceAttributeValuesWithActualOnes( array, attributeName, actualValueAttributeName, additionalProcessor ) {for ( var elementIndex = 0; elementIndex < array.length; elementIndex += 1 ) {var element = array[ elementIndex ];var actualValue = element.getAttribute( actualValueAttributeName );if ( actualValue != null ) {element[ attributeName ] = actualValue;}if ( additionalProcessor != null ) {additionalProcessor( element );}}}function detectFraming() {if ( top != self ) {document.getElementById( "framingWarning" ).style.display = "block";} else {replaceAttributeValuesWithActualOnes( document.links, "href", "acme:href" );replaceAttributeValuesWithActualOnes( document.forms, "action", "acme:action", function ( form ) {replaceAttributeValuesWithActualOnes( form.elements, "disabled", "acme:disabled" );});}}// --></script></head><body onload="detectFraming()"><div id="framingWarning" style="display: none; border-style: solid; border-width: 4px; border-color: #F00; padding: 6px; background-color: #FFF; color: #F00;"><div><b>SECURITY WARNING</b>: Acme App is displayed inside another page.To make sure your data is safe this page has been disabled.<br><a href="framing-detection.html" target="_blank" style="color: #090">Continue working safely in a new tab/window</a></div></div><p>Content. <a href="#" acme:href="javascript:window.alert( 'Action performed' );">Do something</a></p><form name="acmeForm" action="#" acme:action="real-action.html"><p>Name: <input type="text" name="name" value="" disabled="disabled" acme:disabled=""></p><p><input type="submit" name="save" value="Save" disabled="disabled" acme:disabled=""></p></form></body>
</html>

#4楼

if (top != self) {top.location.replace(location);location.replace("about:blank"); // want me framed? no way!
}

#5楼

如果你在buster代码之后添加一个警报,那么警报将停止javascript线程,它将让页面加载。 这就是StackOverflow的功能,即使我使用帧破坏破坏者,它也会从我的iframe中消失。 它也适用于我的简单测试页面。 这仅在Windows 3.5上的Firefox 3.5和IE7中进行了测试。

码:

<script type="text/javascript">
if (top != self){top.location.replace(self.location.href);alert("for security reasons bla bla bla");
}
</script>

#6楼

我会勇敢地把帽子戴在这个戒指的上面(很古老),看看我能收集到多少羽毛。

这是我的尝试,它似乎在我测试它的任何地方都有效(Chrome20,IE8和FF14):

(function() {if (top == self) {return;}setInterval(function() {top.location.replace(document.location);setTimeout(function() {var xhr = new XMLHttpRequest();xhr.open('get','http://mysite.tld/page-that-takes-a-while-to-load',false);xhr.send(null);}, 0);}, 1);
}());

我将此代码放在<head>并从<body>的末尾调用它以确保我的页面在开始与恶意代码争论之前呈现,不知道这是否是最好的方法,YMMV。

它是如何工作的?

......我听到你问-好诚实的回答是,我真的不知道。 在我测试的任何地方都花了很多时间才能使它工作,并且它的确切效果会根据你运行它的位置而略有不同。

以下是它背后的想法:

  • 将函数设置为以尽可能低的间隔运行。 我见过的任何现实解决方案背后的基本概念是用比帧buster-buster更多的事件来填充调度程序。
  • 每次激活此功能时,请尝试更改顶部框架的位置。 要求相当明显。
  • 同时安排一个功能立即运行,这将需要很长时间才能完成(从而阻止帧破坏者阻止位置变化)。 我选择了一个同步XMLHttpRequest,因为它是我能想到的唯一一种不需要(或至少要求)用户交互并且不会占用用户CPU时间的机制。

对于我的http://mysite.tld/page-that-takes-a-while-to-load (XHR的目标),我使用了一个如下所示的PHP脚本:

<?php sleep(5);

怎么了?

  • 当XHR完成时,Chrome和Firefox会等待5秒钟,然后成功重定向到带框页面的URL。
  • IE立即重定向

你不能避免Chrome和Firefox的等待时间吗?

显然不是。 起初我将XHR指向一个返回404的URL - 这在Firefox中不起作用。 然后我尝试了sleep(5); 我最终为这个答案着手的方法,然后我开始以各种方式玩睡眠长度。 我找不到行为的真实模式,但我确实发现,如果它太短,特别是Firefox不会玩球(Chrome和IE似乎表现得相当不错)。 我不知道实际上“太短”的定义是什么,但每次5秒似乎都有效。


如果任何传递Javascript忍者想要更好地解释发生了什么,为什么这(可能)是错误的,不可靠的,他们见过的最糟糕的代码等我会高兴地听。


#7楼

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

#8楼

考虑到为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)


#9楼

setInterval和setTimeout创建一个自动递增的间隔。 每次调用setTimeout或setInterval时,此数字都会增加1,因此如果调用setTimeout,您将获得当前的最高值。

   var currentInterval = 10000;currentInterval += setTimeout( gotoHREF, 100 );for( var i = 0; i < currentInterval; i++ ) top.clearInterval( i );// Include setTimeout to avoid recursive functions.for( i = 0; i < currentInterval; i++ )     top.clearTimeout( i );function gotoHREF(){top.location.href = "http://your.url.here";}

因为几乎闻所未闻的是10000个并发setIntervals和setTimeout工作,并且因为setTimeout返回“最后一个间隔或创建的超时+ 1”,并且因为top.clearInterval仍然可以访问,所以这将击败黑框攻击到帧上面描述的网站。


#10楼

使用htaccess可以避免高位框架集,iframe和任何内容,如图像。

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

这将显示版权页面而不是预期。


#11楼

如果查看setInterval()返回的值,它们通常是单个数字,因此您通常可以使用一行代码禁用所有此类中断:

for (var j = 0 ; j < 256 ; ++j) clearInterval(j)

#12楼

FWIW,大多数当前浏览器都支持 X-Frame-Options:deny指令,即使禁用脚本也可以使用。

IE8:
http://blogs.msdn.com/ie/archive/2009/01/27/ie8-security-part-vii-clickjacking-defenses.aspx

火狐(3.6.9)
https://bugzilla.mozilla.org/show_bug.cgi?id=475530
https://developer.mozilla.org/en/The_X-FRAME-OPTIONS_response_header

镀铬/ Webkit的
http://blog.chromium.org/2010/01/security-in-depth-new-security-features.html
http://trac.webkit.org/changeset/42333


#13楼

截至2015年,您应该使用CSP2的frame-ancestors指令。 这是通过HTTP响应头实现的。

例如

Content-Security-Policy: frame-ancestors 'none'

当然,没有多少浏览器支持CSP2,因此包含旧的X-Frame-Options标头是明智的:

X-Frame-Options: DENY

无论如何,我建议包括两者,否则你的网站将继续容易受到旧浏览器中的Clickjacking攻击,当然即使没有恶意,你也会得到不受欢迎的框架。 大多数浏览器最近会自动更新,但是出于遗留应用程序兼容性原因,您仍然倾向于让企业用户卡在旧版本的Internet Explorer上。


#14楼

我可能刚刚找到了破坏框架破坏者破解程序的方法。 在我的javascript函数中使用getElementsByName,我在frame buster和实际的frame buster buster脚本之间设置了一个循环。 看看这篇文章。 http://www.phcityonweb.com/frame-buster-buster-buster-2426


#15楼

好吧,你可以修改计数器的值,但这显然是一个脆弱的解决方案。 在确定网站不在框架内之后,您可以通过AJAX加载内容 - 这也不是一个很好的解决方案,但它有望避免触发on beforeload事件(我假设)。

编辑:另一个想法。 如果您检测到您在一个框架中,请让用户禁用javascript,然后单击一个链接,将您带到所需的URL(传递一个查询字符串,让您的页面知道告诉用户他们可以重新启用javascript一旦他们在那儿)。

编辑2:去核 - 如果你发现你在一个框架中,只需删除你的文档正文内容并打印一些讨厌的消息。

编辑3:你能枚举顶级文档并将所有函数设置为null(即使是匿名函数)吗?


#16楼

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

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

或者,或者:

window.parent.prevent_bust = 0;

注意:我实际上没有测试过这个。


#17楼

想到这一点,它似乎至少在Firefox和Opera浏览器中起作用。

if(top != self) {top.onbeforeunload = function() {};top.location.replace(self.location.href);
}

#18楼

怎么样反复打电话给破坏者呢? 这将创造一个竞争条件,但人们可能希望这个破坏者出现在最前面:

(function() {if(top !== self) {top.location.href = self.location.href;setTimeout(arguments.callee, 0);}
})();

#19楼

好的,所以我们知道这是一个框架。 所以我们将location.href改为另一个特殊页面,路径为GET变量。 我们现在向用户解释发生了什么,并提供了一个带有target =“_ TOP”选项的链接。 它很简单,可能会工作(没有测试过),但它需要一些用户交互。 也许你可以向用户指出违规网站,并在某个地方为你的网站制作一个羞辱点击夹克的大厅..只是一个想法,但它夜间工作..

Frame Buster Buster ......需要buster代码相关推荐

  1. 02.docker镜像的区别--Alpine、Slim、Stretch、Buster、Jessie、Bullseye

    原文链接 如果您像我一样,第一次创建Dockerfile并从DockerHub页面中选择镜像时,您会彻底困惑.有时候,像这样的选择会让我们的行动停滞不前,所以也许我们只是用标准的镜像,避免深入研究,这 ...

  2. iOS代码编程规范 根据项目经验汇总

    带出几十位从零开始学iOS的实习生或试用期的开发人员后,觉得真的是千人千面,每个人写的代码都风格迥异,如果没有一个文档规范,每次都和新人进行口头的说教,大概自己是不用敲代码了,所以吃了亏了就开始编写i ...

  3. html Frame、Iframe、Frameset 的区别 详细出处参考:http://www.jb51.net/web/22785.html

    10.4.1 Frameset与Frame的区别首先讲解Frameset与Frame之间的区别. 用来划分框架,每一个框架由标记.必须在之内使用,代码如下: 在上面的例子当中,把页面分为左右两个部分, ...

  4. js websocket同步等待_WebSocket硬核入门:200行代码,教你徒手撸一个WebSocket服务器...

    本文原题"Node.js - 200 多行代码实现 Websocket 协议",为了提升内容品质,有较大修订. 1.引言 最近正在研究 WebSocket 相关的知识,想着如何能自 ...

  5. ios开发之UIView的frame、bounds跟center属性的区别(附图)

    博文暂时想到什么写什么,不顺理成章,不顺章成篇. 先看几个概念 坐标点Poit:向右侧为X轴正方向的值x,原点下侧为Y轴正方向的值y 大小Size:由宽度width和高度height构成,表示一个矩形 ...

  6. iOS开发UI篇—手写控件,frame,center和bounds属性

    一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4)如果是button等控件,还需考虑控件的单击事件等 (5)注意:View ...

  7. iOS开发UI基础—手写控件,frame,center和bounds属性

    iOS开发UI基础-手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...

  8. 光流 | OpenCV3实现LK Optical Flow(代码类)

    github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================== ...

  9. 在html语言中frame,html Frame、Iframe、Frameset 的区别

    10.4.1  Frameset与Frame的区别 首先讲解Frameset与Frame之间的区别. 用来划分框架,每一个框架由标记.必须在之内使用,代码如下: 在上面的例子当中, 把页面分为左右两个 ...

最新文章

  1. 交互设计中的c和php,c/s是一种重要的网络计算机模式,其含义是什么
  2. 公交车下发现一具男尸
  3. 【小白学习keras教程】二、基于CIFAR-10数据集训练简单的MLP分类模型
  4. 关于数据契约(DataContract)待续
  5. 编写字符串反转函数 .
  6. 参数化登陆防止SQL注入攻击
  7. linux卸载openJDK
  8. 【Vue指令】—v-if、v-show二者用法及区别
  9. COJ 0967 WZJ的数据结构(负三十三)
  10. Jquery的parent和parents(找到某一特定的祖先元素)
  11. rake matlab,基于MATLABRake接收机仿真及性能分析.doc
  12. 连续+离散变量的联合分布求解
  13. 【Java 8 GC 调优】“代”(Generation)
  14. Java8新特性总结
  15. tomcat配置桌面快捷启动文件
  16. JavaScript 习题及面试题 4
  17. linux下 kafka的安装
  18. python byte转str,str转byte
  19. 蓝牙智能窗帘(天猫精灵生态)方案
  20. 元气森林,只能小而美

热门文章

  1. 算法----------快乐数 (Java版本)
  2. 算法----------加一
  3. Kotlin返回值Unit、Nothing与Any
  4. 设计模式之模板模式学习笔记
  5. 在Homebrew 发布程序
  6. angular5 清除定时器
  7. asp.net 发布程序到iis后无法连接到oralce数据库问题
  8. 苹果的浏览器safari无法识别 2016-1-1这样的日期,会返回Invalid Date
  9. spring 找不到applicationContext.xml解决方法
  10. 0730------Linux网络编程----------服务器端模型(迭代,多进程,多线程,select,poll,epoll 等)...