WEB安全防护相关响应头(上)
WEB 安全攻防是个庞大的话题,有各种不同角度的探讨和实践。即使只讨论防护的对象,也有诸多不同的方向,包括但不限于:WEB 服务器、数据库、业务逻辑、敏感数据等等。除了这些我们惯常关注的方面,WEB 安全还有一个重要的元素——网站的使用者。
他们通常是完全没有 IT 知识的普通用户,网站方可以做点什么,以增加对这些普通用户的保护呢?以前较被忽略的步骤是:正确设置页面的响应头 (Response Headers) 。这类加入安全相关响应头的做法,往往是为了保护客户端/使用者的安全,减少使用者落入黑客的 WEB 陷阱的可能。
这里我们介绍一些较为常用的,和安全相关的响应头。当然,WEB 应用应该根据自己的实际情况部署和设置,并非盲目地一股脑地全部招呼上。
一、X-Frame-Options – 打破框框
从 2008 年开始,研发人员发现一种利用视觉误导,引诱使用者行为的可能,这种做法后来被命名为点击劫持 (Click Jacking) 。
攻击者的通常做法是,在自己的页面里通过框架(iframe)的形式,包含一个不属于它本站的页面。下面的示例代码里包含的就是 【163 邮箱】的设置页。而由黑客控制的父级页面本身可以是任何内容,它通过精确调整自己页面的内容和 iframe 的坐标及大小,再通过 CSS 的 opacity 透明度设置,把用户内容所在的 iframe 透明度设置为全透明。
以下为示例代码:
<style>
.iframe{
opacity: 0.4;}
body {
background: url(./sales.png) no-repeat fixed top;
}
</style>
</head>
<body>
<iframe src="https://m.reg.163.com/?email=1/#/email" width="100%" height="600px" frameBorder="0" class="iframe" scrolling="no"allowtransparency="true">
</iframe>
得到的效果如下图:
(点击查看大图)
请注意我们为了示例效果,特意设置了透明度仅仅为 {opacity:0.4;}
,保持页面上能隐约看到 163 邮箱的内容。但如果CSS代码设置为 {opacity:0;}
,163 邮箱的内容就会消弭于眼前,只留下这张促销图片。但访问者点到相应位置时,依然会触发对163邮箱的请求。这个就是点击劫持的原理。
早期 WEB 开发者应对这个问题的处理,是用 JavaScript 实现的,一般是判断当前 window 对象和 parent 对象是否一致,如果不一致,就执行“破框”跳转。但这个方式并不可靠!因为各种原因,客户端有可能禁止了 JavaScript 执行或代码被绕过,这样“破框”代码就失效了。在人们日益认识到这种攻击方式的危害性后,为统一解决这个问题,制定互联网规范的机构出手了,解决方案就是:
RFC7034
「 HTTP Header Field X-Frame-Options 」
https://tools.ietf.org/html/rfc7034
即引入了一个新的 HTTP 响应头。现在主流常用浏览器已全部支持这一响应头。具有这个响应头的资源,可以拒绝自己被非法站点的以下标签引用:
- iFrame 标签
- Frame 标签
- Object 标签
- Applet 标签
- Embed 标签
这个头有三种选项,对应如下:
三种选项 | 具体含义 |
---|---|
X-Frame-Options: DENY | 完全不能被嵌入到 iframe、frame 等标签中 |
X-Frame-Options: SAMEORIGIN | 只能被同源页面嵌入到 iframe 或者 frame 中 |
X-Frame-Opti |