对“X-Frame-Options安全性头上”文章的学习

763 阅读6分钟

 X-Frame-Options

X-Frame-Options是一个可选的HTTP响应标头(即服务器端返回响应信息中的响应头信息),在Web应用程序中设置此标头将定义它是否在框架元素中工作。 此标头的语法提供了三个选项: 

ALLOW-FROM——允许特定来源列入白名单,只需要跟URL就好 

DENY——任何网站都不允许在框架中显示 

SAMEORIGIN——只有符合同域策略(协议、路径、端口号都相同)的网站才能将本网站放在iframe里面。 不发送此标头意味着允许通过帧。 

重点介绍部分攻击 

点击劫持(单击劫持)

 [单击劫持](en.wikipedia.org/wiki/Clickj…

 以下是对单击劫持很好的解释

 “一个邪恶的网页可以秘密地将你的网页包含在一个框架中。但是这个邪恶网站的作者将使您的网站透明,并在其上显示按钮。然后,访问此邪恶页面 的任何人都会单击看似无关的内容,这实际上会导致您的Web应用程序中的鼠标点击。”

 以下为我个人理解(两个相反的嵌入操作,都是为了做到视觉欺骗) 

  • 在别人的网站上插入一个透明的iframe(自己做的),以达到诱导别的用户完成一些操作。可以通过以下的操作拒绝别人的嵌套。
  •  为什么自己的网页要在iframe上嵌入透明的别人的网站的内容,因为我可以诱导他点开类似密码可见的按钮,这是必须阻止的。  

那么是什么导致了这些攻击有漏洞可钻呢,为什么我们无法消除所有的攻击?

“对其他网站的广泛攻击利用了浏览器中缺少的安全功能**。大多数现代浏览器都提供强化的安全机制,可以很容易地阻止内容注入的问题。与往常一样,问题在于向后兼容性。最新的浏览器版本显然比以前的版本更安全。但是,当有人构建您的网站时,他们可以告诉它以兼容模式运行。此功能仅适用于Internet Explorer,但它将带回IE7(2006)的老式渲染算法**。在 IE 中,文档模式从顶部窗口继承到所有框架。如果邪恶的网站在IE7兼容模式下运行,那么您的网站也是如此!”

向后兼容性“,旧版本的浏览器的一些功能在新版本里仍然能被正常使用

“兼容模式”(参考”关于IE的文档模式的指定“,所有参考的链接放在文章末尾),强制 Internet Explorer  按照在旧版本的浏览器中查看站点的方式来显示内容。通过使用 <meta>元素将 X-UA-Compatible 标头添加到网页中,可以实现这一点。

Internet Explorer 7 提供了通用选择器支持等新功能,旨在更全面地支持行业标准。 由于 指令仅支持 Quirks 模式和标准模式这两种设置.Quirks模式就是指,当你没有加或者浏览器识别不了这个指令的时候,就会按照设定的某个旧版本的浏览器查看站点的方式来显示内容。

以下是如何在任何网站中触发IE7兼容性的示例:

<meta http-equiv="X-UA-Compatible" content="IE=7" />

指定旧文档模式(可见微软官方文档):
下一个示例演示如何使用标头将网页限制为早期版本的 Internet Explorer 支持的文档模式:

<html>
<head>
  <!-- Use Internet Explorer 9 Standards mode “使用IE9标准模式”重点就是这一句
   当然,你也可以将9修改成7或者其他版本-->
  <meta http-equiv="x-ua-compatible" content="IE=9">
  <title>My webpage</title>
</head>
<body>
  <p>Content goes here.</p>
</body>
</html>

此示例使用****元素来包含标头,该标头指示 Internet Explorer 以 IE9 标准模式显示网页,从而有效地将网页限制为 Windows Internet Explorer 9 支持的功能。

标头的效果取决于用于查看网页的浏览器版本,如图

(在“指定浏览器模式或文档模式无效“中能较好理解上表)

查看这些结果时,请记住以下几点:

  • 如果网页指定了 doctype 指令并包含标头,则标头优先于该指令。

  • 如果浏览器支持标题,但不支持任何指定的文档模式,它将使用支持的最高文档模式来显示网页。

  • 不支持标头的旧版本的浏览器使用<!DOCTYPE>以确定文档模式。

  • Internet Explorer 9 及更早版本显示网页时无需<!DOCTYPE> IE5(Quirks)模式下的指令。因此,我们建议所有网页都指定**<!DOCTYPE>**指令,例如HTML5 doctype。

标头不区分大小写;但是,它最好紧跟在<title>之后。

跨站点脚本(XSS)攻击

针对潜在攻击者的另一种技术带有 window.name。您的浏览窗口的此属性(选项卡,弹出窗口和框架都是JavaScript意义上的窗口)可以由其他人设置,您无法阻止它。这样做的影响是多方面的

有时,当攻击者能够在您的网页上注入和执行脚本时,他可能会受到长度限制的阻碍。例如,您的网站不允许使用超过 80 个字符的名称。或者消息不得超过 140。

”window.name 属性可以帮助以非常简单的方式绕过这些限制。“攻击者可以通过在框架的属性中提供您的网站来构建您的网站并为其提供他喜欢的名称。然后,他将执行的 JavaScript 可以很短 ,这意味着它将执行在框架元素的 name 属性中指定的 JavaScript。(就是说通过把脚本插入name中,使得脚本被执行)

比如这里可以这么用,已知<a>的target还有其他的值:当采用frameset框架的时,target="frame_name",即可指定a的目标地址,或者链接到另一个页面是,指定该页面的window.name属性。那么可以写一个页面,其中写一句<a href="某网址" target="?????恶意脚本?????">,点击之后可以跳转到这个页面,这个target会被赋值给href中的某网址的window.name属性。

为了防御这个攻击,最好就是使用X-Frame-Options安全标头。

对于 NodeJS 应用程序,可以使用头盔库添加安全标头。如果想直接从Apache或nginx中设置这个标题,只需看看MDN上的X-Frame-Options文章

参考文档以及资料:

  1. 关于X-Frame-Options安全标头-Mozilla安全博客——blog.mozilla.org/security/20…

  2. 向后兼容性(作者:微软官方文档)——docs.microsoft.com/en-us/previ…

  3. 指定浏览器模式(browser mode)或文档模式(document mode)无效——www.likecs.com/show-204858…

  4. 关于IE的文档模式的指定——blog.51cto.com/u\_15166492…

  5. 头盔库——www.npmjs.com/package/hel…

某些地方由于是自己思考,所以可能有错误的地方,还请指正