javascript - 帧Buster Buster需要buster代码

  显示原文与译文双语对照的内容

在一个让我们说你不想让其他站点也能你"图文框"site:


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

所以你插入 anti-framing,框架破坏所有页面:


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

好极了现在你可以自动删除任何包含iframe的文件。 除了一个小问题。

事实证明,你 frame-busting代码可以被捕,这里:


<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难题等更比一个实际问题 --你怎么能有效防范这些frame-busting特号?

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

  • 通过 onbeforeunload = null 试图清除 onbeforeunload 事件没有影响
  • 添加 alert() 停止了进程,让用户知道它正在发生,但没有以任何方式干扰代码;单击ok确定lets可以让中断继续正常运行
  • 我想不出办法清除 setInterval() 计时器

我不是一个JavaScript程序员,所以下面是我对你的挑战: ,你能把 frame-busting buster bust

时间:

经过一段时间的思考,我相信这将向他们展示谁是老板。


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

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

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


<style>
 body { 
 display : none 
}
</style>
<script>
if(self == top) {
document.getElementsByTagName("body")[0].style.display = 'block';
}
else{
top.location = self.location;
}
</script>

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

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

如果检测到一个包含帧,输入将被禁用,并在页面顶部显示一条警告消息。 警告消息包含在新窗口中打开网页安全版本的链接。 这将阻止页面用于 clickjacking,同时仍然允许用户查看其他情况下的内容。

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

下面是代码。你需要将标准的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>

...