菜单

跑步踏入全站 HTTPS ,那一个经历值得你看看

2019年9月23日 - 2020欧洲杯冠军竞猜

合理使用 CSP

CSP,全称是 Content Security
Policy,它有非常多的指令,用来实现各种各样与页面内容安全相关的功能。这里只介绍两个与
HTTPS 相关的指令,更多内容可以看我之前写的《Content Security Policy
Level 2
介绍》。

现代浏览器

现代浏览器(Chrome、Firefox、Safari、Microsoft Edge),基本上都遵守了
W3C 的混合内容Mixed Content规范,将
混合内容分为 Optionally-blockable 和 Blockable 两类:

Optionally-blockable 类混合内容包含那些危险较小,即使被中间人篡改也无大碍的资源。现代浏览器默认会加载这类资源,同时会在控制台打印警告信息。这类资源包括:

除此之外所有的混合内容都是 Blockable,浏览器必须禁止加载这类资源。所以现代浏览器中,对于
HTTPS 页面中的 JavaScript、CSS 等 HTTP
资源,一律不加载,直接在控制台打印错误信息。

HSTS 基本使用

这个问题可以通过 HSTS(HTTP Strict Transport
Security,RFC6797)来解决。HSTS
是一个响应头,格式如下:

  1. Strict-Transport-Security: max-age=expireTime [; includeSubDomains][; preload]

HSTS 这个响应头只能用于 HTTPS 响应;网站必须使用默认的 443
端口;必须使用域名,不能是 IP。而且启用 HSTS
之后,一旦网站证书错误,用户无法选择忽略。

这篇文章是基于我在迁移 的时候,和在公司跟进部署
HTTPS 的一些经验所编写。收录在《Said – 从 HTTP 到 HTTPS 》系列:

HSTS Preload List

可以看到 HSTS 可以很好的解决 HTTPS 降级攻击,但是对于 HSTS 生效前的首次
HTTP 请求,依然无法避免被劫持。浏览器厂商们为了解决这个问题,提出了 HSTS
Preload List
方案:内置一份列表,对于列表中的域名,即使用户之前没有访问过,也会使用
HTTPS 协议;列表可以定期更新。

目前这个 Preload List 由 Google Chrome 维护,Chrome、Firefox、Safari、IE
11 和 Microsoft Edge
都在使用。如果要想把自己的域名加进这个列表,首先需要满足以下条件:

即便满足了上述所有条件,也不一定能进入 HSTS Preload
List,更多信息可以看这里。通过
Chrome 的 chrome://net-internals/#hsts工具,可以查询某个网站是否在
Preload List 之中,还可以手动把某个域名加到本机 Preload List。

对于 HSTS 以及 HSTS Preload List,我的建议是只要你不能确保永远提供 HTTPS
服务,就不要启用。因为一旦 HSTS 生效,你再想把网站重定向为
HTTP,之前的老用户会被无限重定向,唯一的办法是换新域名。

合理使用 SRI

HTTPS
可以防止数据在传输中被篡改,合法的证书也可以起到验证服务器身份的作用,但是如果
CDN 服务器被入侵,导致静态文件在服务器上被篡改,HTTPS 也无能为力。

W3C 的 SRI(Subresource Integrity)规范可以用来解决这个问题。SRI
通过在页面引用资源时指定资源的摘要签名,来实现让浏览器验证资源是否被篡改的目的。只要页面不被篡改,SRI
策略就是可靠的。

有关 SRI 的更多说明请看我之前写的《Subresource Integrity 介绍》。SRI
并不是 HTTPS
专用,但如果主页面被劫持,攻击者可以轻松去掉资源摘要,从而失去浏览器的
SRI 校验机制。

CDN 安全

对于大站来说,全站迁移到 HTTPS 后还是得用 CDN,只是必须选择支持 HTTPS 的
CDN 了。如果使用第三方 CDN,安全方面有一些需要考虑的地方。

iframe

iframe 只能是被嵌入的 url 也同样支持
HTTPS,目前本人并未找到合适的方案。当然如果你们服务端真心 NB
的话也可以像某大型搜索引擎一样把需要内嵌 iframe
的站点抓到自己的服务器上。

block-all-mixed-content

前面说过,对于 HTTPS 中的图片等 Optionally-blockable 类 HTTP
资源,现代浏览器默认会加载。图片类资源被劫持,通常不会有太大的问题,但也有一些风险,例如很多网页按钮是用图片实现的,中间人把这些图片改掉,也会干扰用户使用。

通过 CSP
的 block-all-mixed-content 指令,可以让页面进入对混合内容的严格检测(Strict
Mixed Content Checking)模式。在这种模式下,所有非 HTTPS
资源都不允许加载。跟其它所有 CSP
规则一样,可以通过以下两种方式启用这个指令:

HTTP 响应头方式:

JavaScript

Content-Security-Policy: block-all-mixed-content

1
Content-Security-Policy: block-all-mixed-content

<meta> 标签方式:

XHTML

<meta http-equiv=”Content-Security-Policy”
content=”block-all-mixed-content”>

1
<meta http-equiv="Content-Security-Policy" content="block-all-mixed-content">

HSTS 基本使用

这个问题可以通过 HSTS(HTTP Strict Transport
Security,RFC6797)来解决。HSTS 是一个响应头,格式如下:

  1. Strict-Transport-Security: max-age=expireTime [; includeSubDomains][; preload]

HSTS 这个响应头只能用于 HTTPS 响应;网站必须使用默认的 443
端口;必须使用域名,不能是 IP。而且启用 HSTS
之后,一旦网站证书错误,用户无法选择忽略。

block-all-mixed-content

前面说过,对于 HTTPS 中的图片等 Optionally-blockable 类 HTTP
资源,现代浏览器默认会加载。图片类资源被劫持,通常不会有太大的问题,但也有一些风险,例如很多网页按钮是用图片实现的,中间人把这些图片改掉,也会干扰用户使用。

通过 CSP
的 block-all-mixed-content 指令,可以让页面进入对混合内容的严格检测(Strict
Mixed Content Checking)模式。在这种模式下,所有非 HTTPS
资源都不允许加载。跟其它所有 CSP
规则一样,可以通过以下两种方式启用这个指令:

HTTP 响应头方式:

  1. Content-Security-Policy: block-all-mixed-content

<meta> 标签方式:

  1. <metahttp-equiv="Content-Security-Policy"content="block-all-mixed-content">

HTTP严格传输安全协议

HTTP 严格传输安全协议( HTTP Strict Transport Security,简称 HSTS )是
互联网工程任务小组 (Internet Engineering Task Force,简称IETF)
发布的互联网安全策略,后者负责互联网标准的开发和推动。网站可以选择使用
HSTS 策略,让浏览器强制使用 HTTPS 协议访问。

为什么要强制访问呢? 因为传统的 HTTP 跳到 HTTPS 都依赖服务端 301/302
跳转,例如访问 http://tasaid.com 跳转到
https://tasaid.com,而这次强制跳转的通信,是基于 HTTP
的,所以是可能被劫持的。

设置 HSTS 之后,浏览器会在本地替换协议为 HTTPS
然后访问服务器,而不用再依赖服务器跳转,可以更多的减少会话劫持攻击。

HSTS 是一个响应头,只能用于 HTTPS 响应,HTTP 环境下会忽略掉这个响应头:

Strict-Transport-Security: max-age=expireTime [; includeSubDomains] [; preload]
参数 释义
max-age 指定的时间内 (单位是秒),网站必须使用 HTTPS 协议来访问
includeSubDomains 子域名也必须通过 HTTPS 协议来访问
preload 让浏览器由安全域名列表 (Preload List) 决定是否本地替换为 HTTPS 请求

最后这个 preload 可能有点抽象,就是各大浏览器厂商
(Chrome/Firefox/IE/Safari/Edge) 共同维护的一个域名列表 (Preload
List),你可以 在这里查询 ,chrome
浏览器可以直接在本地访问 chrome://net-internals/#hsts 查询。

设定 preload 参数,浏览器会
根据当前网站满足的条件
尝试把网站加入这个域名列表 (Preload
List),其他用户再访问这个网站的时候,如果这个网站域名存在于这个域名列表中,则自动启用
HTTPS 访问。

当用户第一次访问一个从来没访问过的网站时,本地是没有 HSTS
信息的,所以这个第一次的会话仍然是可能被劫持的。preload
就是为了解决这个第一次会话劫持的问题的。

值得注意的是:一旦 HSTS 生效,在 max-age
指定的时间内,你再想把网站重定向为
HTTP,之前的老用户会被无限重定向。而且一旦网站证书错误,用户无法选择忽略。

HSTS 是个大招,不要随便开,不然技能冷却时间的时间内。

合理使用 HSTS

在网站全站 HTTPS 后,如果用户手动敲入网站的 HTTP
地址,或者从其它地方点击了网站的 HTTP 链接,依赖于服务端 301/302
跳转才能使用 HTTPS 服务。而第一次的 HTTP
请求就有可能被劫持,导致请求无法到达服务器,从而构成 HTTPS 降级劫持。

合理使用 CSP

CSP,全称是 Content Security
Policy,它有非常多的指令,用来实现各种各样与页面内容安全相关的功能。这里只介绍两个与
HTTPS 相关的指令,更多内容可以看我之前写的《Content Security Policy
Level 2 介绍》。

现代浏览器

现代浏览器(Chrome、Firefox、Safari、Microsoft Edge),基本上都遵守了
W3C 的混合内容Mixed
Content规范,将
混合内容分为 Optionally-blockable 和 Blockable 两类:

Optionally-blockable 类混合内容包含那些危险较小,即使被中间人篡改也无大碍的资源。现代浏览器默认会加载这类资源,同时会在控制台打印警告信息。这类资源包括:

除此之外所有的混合内容都是 Blockable,浏览器必须禁止加载这类资源。所以现代浏览器中,对于
HTTPS 页面中的 JavaScript、CSS 等 HTTP
资源,一律不加载,直接在控制台打印错误信息。

这篇文章首发于我的个人网站:听说 –
https://tasaid.com/,建议在我的个人网站阅读,拥有更好的阅读体验。

相关文章

标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图