Featured image of post HTTP 协议与安全

HTTP 协议与安全

总结与整理 HTTP 协议与 HTTP 安全相关内容

HTTP 协议

什么是 HTTP

HTTP 全称 Hyper Text Transfer Protocol,即超文本传输协议。是一个用于传输超媒体文档(如HTML)的 应用层 协议

遵循 客户端 - 服务端 模型,是一种无状态通讯协议,通常基于 TCP/IP 层,可以在任何可靠的 传输层 上使用

HTTP 概述

客户端-服务端模型

从一个客户端发起请求(通常是浏览器,也可以是爬虫、调试工具等),服务端响应这个请求。在客户端与服务端中间,还有许多的 代理、网关

代理、网关

一个请求从客户端到服务端,并不是直达的,中间需要经过许多代理或网关的转发,最终到目标服务端进行响应,响应回到客户端同样如此。代理主要有以下几种作用:

  1. 缓存、日志(存储一些请求响应的信息)
  2. 过滤(病毒扫描等)
  3. 认证(第三方证书,HTTP 加密过程会详细讲解)
  4. 负载均衡(服务容灾)

HTTP 本质

简单的二进制报文,HTTP/2 将消息封装到帧中。可扩展,只需要客户端和服务端达成一致。无状态但有会话,通过 Cookie 将数据包装在消息头中,每次请求都携带这些信息,就可以实现客户端与服务端会话。HTTP 请求与响应直间是建立 TCP 连接,TCP 中常谈的就是 三次握手四次挥手

HTTP 报文

在 HTTP/1.1 及更早的报文协议中,是可读的。在 HTTP/2 中,遗弃了一些无用的信息,将剩下的进行压缩存到二进制帧中,并且实现多路复用。虽然 HTTP/2 报文被压缩和封装,但是语义不变,仍然是可读的,只是需要格式解析,这在提高传输速率的同时,也提高了安全性

HTTP 的发展

起源

万维网基础协议,创建时间(1989-1991)

HTTP/0.9

单行协议,更早之前的协议没有版本号。只有 GET 方法,只能传输 HTML 文本,也没有状态码

HTTP/1.0

可扩展性,增加协议头,增加状态码,可以传输除HTML以外的其他类型文档(不包括音视频)

HTTP/1.1

协议标准化,消除大量歧义内容。连接可复用,并发,内容协商,响应分块。SSL 在此基础上创建

HTTP/2

二进制协议,与 HTTP 1.1 的不同:

  1. 二进制协议
  2. 多路复用
  3. 标头压缩
  4. 运行服务端向客户端缓存填充数据(推送)
  5. 禁止协议升级,只有 HTTP/1.1 才支持将请求升级为 WebSocket

HTTP/3

下一个主要版本(截至2022年10月,26%的网站正在使用)。基于 Google 公司的 QUIC(替代TCP)。基于 TCP 的并发请求还是同一个 TCP 连接,而基于 QUIC 则未每个流独立实现包丢失和重传

协议升级(WebSocket)

  1. 由客户端发起,现在请求头中设置 Connection=Upgrade 请求连接升级
  2. 服务端同意升级,返回 101 状态码,添加 Upgrade=websocket 标头,协议升级
  3. 生成 WebSocket 传输密钥等,每次交互都要验证

HTTP 加密过程

由于 HTTP 协议在传输过程中,数据是明文传输的,如果不进行任何处理,那么敏感数据必定是会泄露的。中间的代理、网关和黑客都能挟持你的请求和响应,以获取敏感信息、嵌入广告、木马程序注入等

加密主要分为三个阶段:

  1. 证书校验:由第三方颁发的数字证书,包含一对公钥和私钥。
    • 因为请求中间会经过许多代理和网关,这些数字证书由这些中间机构颁发
    • 服务器收到证书,保留私钥(私钥可以解密公钥加密的密文)
  2. 非对称加密:客户端解析证书,并验证证书的合法性
    • 提取公钥,生成随机 Key,加密报文
    • 私钥解密报文,并提取到随机 Key,将返回结果使用随机 Key 加密
  3. 对称加密:此时响应报文可以通过客户端的私钥解密

服务器发送到用户浏览器并保存在本地的一小块数据,当浏览器再次发送请求时,会携带这些 Cookie。主要应用场景:

  1. 会话状态管理
  2. 个性化设置
  3. 浏览器行为跟踪

浏览器接收到 Cookie 时,并不能保证其来源是目标服务器

  1. 定义生命周期:每当站点的用户进行身份验证,重新生成并发送 Cookie,可以有效防止 会话固定攻击(SFA)
  2. 限制访问:添加 SecureHttpOnly 属性,前者限定只能通过 HTTPS 发送,后者限定无权访问硬盘。有助于缓解 跨站站点脚本攻击(XSS)
  3. SameSite 属性:指定 是否/何时 通过跨站点请求发送,提供了 **跨站点请求伪造攻击(CSRF)**的保护
  4. Cookie 前缀:通过添加 Cookie 前缀,更有效防止 会话劫持攻击(SFA),与第一条的会话固定攻击是同一个意思

LocalStorage

对一个请求源的特定数据进行长期保留

  1. 页面关闭时不会被清除,只能 用户/脚本 手动清除

SessionStorage

对一个请求源的特定数据进行临时保留

  1. 一个浏览器标签页打开开始一个会话缓存,关闭清除会话缓存
  2. 同一个源的 不同标签页/窗口 都会创建新的会话缓存,但是 新开标签页/窗口 会复制 顶层浏览会话

HTTP 安全

内容安全策略

英文名Content Security Policy(CSP)

削弱/缓解 跨站脚本(XSS)数据注入 等,保护数据内容不被盗取、污染

使用 <meta> 标签配置策略:

1
2
3
<meta
  http-equiv="Content-Security-Policy"
  content="default-src 'self'; img-src https://*; child-src 'none';" />

使用 Content-Security-Policy 标头配置策略:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 所有内容均来自站点的同一个源
Content-Security-Policy = "default-src 'self'"
# 允许内容来自信任的域名及其子域名(域名不必须与 CSP 设置所在的域名相同)
Content-Security-Policy = "default-src 'self' *.trusted.com"
# 允许网页应用的用户在他们自己的内容中包含来自任何源的图片
# 但是限制音频或视频需从信任的资源提供者,所有脚本必须从特定主机服务器获取可信的代码
Content-Security-Policy = "default-src 'self'; img-src *; media-src media1.com media2.com; script-src userscripts.example.com"
# 线上银行网站: 确保网站的所有内容都要通过 SSL 方式获取,以避免攻击者窃听用户发出的请求
Content-Security-Policy = "default-src https://onlinebanking.jumbobank.com"
# 在线邮箱: 允许在邮件里包含 HTML,同样图片允许从任何地方加载
# 但不允许 JavaScript 或者其它潜在的危险内容(从任意位置加载)
Content-Security-Policy = "default-src 'self' *.mailsite.com; img-src *"

HTTS

即HTTP Strict-Transport-Security,限制只能通过 HTTPS 访问,配置示例:

1
2
3
4
5
6
# 所有子域名会自动使用 HTTPS,有效期(max-age)为 1 年。推荐设置为 2 年 
# 同时阻止了只能通过 HTTP 访问页面或者子域的内容
Strict-Transport-Security = "max-age=31536000; includeSubDomains"
# 有效期(max-age)被设置为 2 年,并带有 preload 后缀
# 该后缀是网站被收录到所有主流的 web 浏览器(如 Chromium、Edge 以及 Firefox)的 HSTS 预加载列表所必须的
Strict-Transport-Security = "max-age=63072000; includeSubDomains; preload"

在前面已经提到 Cookie 安全性

X-Content-Type-Options

提示标志,提示客户端一定要遵循在 Content-Type 首部中对 MIME 类型 的设定,而不能对其进行修改

X-Frame-Options

是否允许页面在 <frame> <iframe> <embed> <object> 中展现

1
2
X-Frame-Options = "DENY"
X-Frame-Options = "SAMEORIGIN"

X-XSS-Protection

检测到攻击脚本时,停止加载页面。 CSP 的替代方案

Licensed under CC BY-NC-SA 4.0