现代浏览器提供了一些安全相关的响应头,使用这些响应头一般只需要修改服务器配置即可,不需要修改程序代码,成本很低。本文介绍一些这样的响应头:

1. Strict-Transport-Security

HTTP Strict Transport Security,简称为 HSTS。它允许一个 HTTPS 网站,要求浏览器总是通过 HTTPS 来访问它。现阶段,除了 Chrome 浏览器,Firefox4+,以及 Firefox 的 NoScript 扩展都支持这个响应头。

我们知道 HTTPS 相对于 HTTP 有更好的安全性,而很多 HTTPS 网站,也可以通过 HTTP 来访问。开发人员的失误或者用户主动输入地址,都有可能导致用户以 HTTP 访问网站,降低了安全性。一般,我们会通过 Web Server 发送 301/302 重定向来解决这个问题。现在有了 HSTS,可以让浏览器帮你做这个跳转,省一次 HTTP 请求。另外,浏览器本地替换可以保证只会发送 HTTPS 请求,避免被劫持。

要使用 HSTS,只需要在你的 HTTPS 网站响应头中,加入下面这行:

strict-transport-security: max-age=16070400; includeSubDomains

includeSubDomains 是可选的,用来指定是否作用于子域名。支持 HSTS 的浏览器遇到这个响应头,会把当前网站加入 HSTS 列表,然后在 max-age 指定的秒数内,当前网站所有请求都会被重定向为 https。即使用户主动输入 http:// 或者不输入协议部分,都将重定向到 https:// 地址。

Chrome 内置了一个 HSTS 列表,默认包含 Google、Paypal、Twitter、Linode 等等服务。我们也可以在 Chrome 输入 chrome://net-internals/#hsts,进入 HSTS 管理界面。在这个页面,你可以增加/删除/查询 HSTS 记录。例如,你想一直以 https 访问某网址,通过 “add Domain” 加上去就好了。查看 Chrome 内置的全部 HSTS 列表,或者想把自己的网站加入这个列表,请点这里

2. X-Frame-Options

X-Frame-Options,是为了减少点击劫持(Clickjacking)而引入的一个响应头。Chrome4+、Firefox3.6.9+、IE8+ 均支持,详细的浏览器支持情况看这里。使用方式如下:

x-frame-options: SAMEORIGIN

这个响应头支持三种配置:

  • DENY:不允许被任何页面嵌入;
  • SAMEORIGIN:不允许被本域以外的页面嵌入;
  • ALLOW-FROM uri:不允许被指定的域名以外的页面嵌入(Chrome现阶段不支持);

如果某页面被不被允许的页面以 <iframe> 或 <frame> 的形式嵌入,IE 会显示类似于“此内容无法在框架中显示”的提示信息,Chrome 和 Firefox 都会在控制台打印信息。由于嵌入的页面不会加载,这就减少了点击劫持的发生。

3. X-XSS-Protection

顾名思义,这个响应头是用来防范 XSS 的。最早我是在介绍 IE8 的文章里看到这个,现在主流浏览器都支持,并且默认都开启了 XSS 保护,用这个 header 可以关闭它。它有几种配置:

  • 0:禁用XSS保护;
  • 1:启用XSS保护;
  • 1; mode=block:启用XSS保护,并在检查到XSS攻击时,停止渲染页面(例如IE8中,检查到攻击时,整个页面会被一个#替换);

浏览器提供的XSS保护机制并不完美,但是开启后仍然可以提升攻击难度,总之没有特别的理由,不要关闭它。

4. X-Content-Type-Options

互联网上的资源有各种类型,通常浏览器会根据响应头的 Content-Type 字段来分辨它们的类型。例如:”text/html” 代表 html 文档,”image/png” 是PNG图片,”text/css” 是 CSS 样式文档。然而,有些资源的 Content-Type 是错的或者未定义。这时,某些浏览器会启用 MIME-sniffing 来猜测该资源的类型,解析内容并执行。

例如,我们即使给一个 html 文档指定 Content-Type 为 “text/plain”,在 IE8- 中这个文档依然会被当做 html 来解析。利用浏览器的这个特性,攻击者甚至可以让原本应该解析为图片的请求被解析为 JavaScript。通过下面这个响应头可以禁用浏览器的类型猜测行为:

X-Content-Type-Options: nosniff

这个响应头的值只能是 nosniff,可用于 IE8+ 和 Chrome。另外,它还被 Chrome 用于扩展下载,见这里

5. X-Content-Security-Policy

这个响应头主要是用来定义页面可以加载哪些资源,减少 XSS 的发生。之前单独介绍过,请点击继续浏览:Content Security Policy介绍

别人怎么用

最后,我们来看看几个实际案例:

Google+,使用了这几个本文提到的响应头:

x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block

Twitter使用了这些:

strict-transport-security: max-age=631138519
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block

PayPal的:

X-Frame-Options: SAMEORIGIN
Strict-Transport-Security: max-age=14400

Facebook则使用了这些(配置了详细的CSP,关闭了XSS保护):

strict-transport-security: max-age=60
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 0
content-security-policy: default-src *;script-src https://*.facebook.com http://*.facebook.com https://*.fbcdn.net http://*.fbcdn.net *.facebook.net *.google-analytics.com *.virtualearth.net *.google.com 127.0.0.1:* *.spotilocal.com:* chrome-extension://lifbcibllhkdhoafpjfnlhfpfgnpldfl 'unsafe-inline' 'unsafe-eval' https://*.akamaihd.net http://*.akamaihd.net;style-src * 'unsafe-inline';connect-src https://*.facebook.com http://*.facebook.com https://*.fbcdn.net http://*.fbcdn.net *.facebook.net *.spotilocal.com:* https://*.akamaihd.net ws://*.facebook.com:* http://*.akamaihd.net https://fb.scanandcleanlocal.com:*;

原文链接:https://imququ.com/post/web-security-and-response-header.html

  • elastalert

    前言最近想在 ELK 基础上,临时搭一个告警系统,这里介绍有关 elastalert 的安装及使用。 安装参考官方安装说明: git clone https://github.com/bitsensor/elastalert.git;...

    elastalert
  • ipset

    ipset 安装参考文档(待整理)ipset 官方文档ipset 7.1版本链接使用参考文档 简单的流程可以用这几条命令概括使用 ipset 和 iptables 进行 IP 封禁的流程 ipset create blacklist ...

    ipset
  • 藏独组织“野鸡”的挑衅

    前言2019 年 1 月 12 日,有人以“匿名者”名义通过 YouTube 发布视频,呼吁将于2月13日针对中国部分政府网站进行网络攻击,并于 1 月 16 日在 PastBin 发布 100 个被攻击单位网站列表。 追踪视频明确...

    藏独组织“野鸡”的挑衅
  • 删除非目录文件

    linux 下删除一个目录下所有的隐藏文件和非目录文件 前言在 alpine 基础上编译 OpenWAF,想要达到最简,删除无用文件。 亮点rm -rf `ls -Fa | grep '^\.\w'` -- 删除隐...

    删除非目录文件
  • 在 alpine 上编译 openssl 遇到的问题

    alpine 上编译 openssl (v1.1.1) 遇到 ucontext 报错 前言今天在 alpine 基础上编译 openwaf,编到 openssl 时,报 ucontext 相关错误。 ucontext 报错编译 ope...

    在 alpine 上编译 openssl 遇到的问题
  • 用 hugo 创建自己的博客

    如何用 hugo 搭建自己的博客 前言前两天,hexo 打开了自建博客的道路。今天看到了 hugo,准备研究一下。hugo 是用 go 语言开发的,优势在于编译速度快。如果博客文章达到七八百篇,hexo 可能要几十分钟,但 hugo“...

    用 hugo 创建自己的博客
  • 对于 hexo Annie 主题部分修改

    修改部分 Annie 主题的设置 字体默认字体Annie 默认是繁体字,改为默认是简体字 修改 Annie\source\js\chinese.js 文件的第五行 原文: var zh_choose = 't'; 改为...

    对于 hexo Annie 主题部分修改
  • 批量修改或添加文件后缀名

    前言常见的是对不同文件名进行文件后缀名修改。但今天遇到同一文件名的情况。 常见windows 或 Linux 命令: ren *.jpg *.bmp # 将 jpg 后缀改为 bmp 如:1.jpg 2.txt 改后为:1.bm...

    批量修改或添加文件后缀名
  • 解决背景与文字颜色冲突问题

    解决因背景图颜色,导致文字看不清晰的问题 前言刚刚创建此博客,被随机背景图和散文诗集吸引。但常常因为背景图颜色过浅,导致白色的文字看不清晰。 方法本来想把所有的背景图都换成黑色的。但当我下载了 1500 多张图,准备从中挑出所有的...

    解决背景与文字颜色冲突问题
  • OpenWAF 使用手册

    NameOpenWAF 第一个全方位开源的Web应用防护系统(WAF),更全面的防护功能,更多样的防护策略 Table of Contents Name Version Synopsis Description Installatio...

    OpenWAF 使用手册