跳转至

HTTP 协议详解

HTTP 协议详解

本章导读:本章系统解析 HTTP 协议的演进历程、请求/响应报文结构、状态码含义、头部字段作用、缓存机制、HTTPS/TLS 加密原理,以及 HTTP/2、HTTP/3 的新特性与安全测试要点。

HTTP 的发展背景与演进

HTTP(Hypertext Transfer Protocol)是 Web 的基石,由 Tim Berners-Lee 在 1991 年提出。其发展历程与互联网关键节点密切相关:

版本 年份 核心特性 安全测试意义
HTTP/0.9 1991 仅支持 GET 方法,无头部、无状态码,纯文本传输 无现代安全机制
HTTP/1.0 1996 引入 POST、HEAD、PUT、DELETE、OPTIONS、TRACE 方法;引入状态码、头部字段;支持多媒体内容 无持久连接,每次请求新建 TCP 连接
HTTP/1.1 1997 持久连接(Keep-Alive)、管道化(Pipelining)、分块传输编码(Chunked)、缓存控制、Host 头部、断点续传 主流版本,安全测试的主要目标
HTTP/2 2015 二进制分帧、多路复用(Multiplexing)、头部压缩(HPACK)、服务器推送(Server Push)、流优先级 基于 TLS,强制加密,攻击面分析需关注帧结构
HTTP/3 2022 基于 QUIC 协议(UDP 之上),0-RTT 握手、连接迁移、无队头阻塞、内置 TLS 1.3 新协议栈,抓包分析工具需支持 QUIC

HTTP 请求报文详解

报文结构(以 POST 请求为例)

POST /api/login HTTP/1.1                    ← 请求行(方法 + 路径 + 版本)
Host: www.example.com                       ← 请求头开始
Content-Type: application/x-www-form-urlencoded
Content-Length: 39
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html,application/xhtml+xml
Accept-Language: zh-CN,zh;q=0.9
Accept-Encoding: gzip, deflate, br
Cookie: sessionId=abc123; token=xyz789
Connection: keep-alive
                                            ← 空行(CRLF)
username=admin&password=123456&remember=on    ← 请求体(Body)

请求行详解

  • 方法(Method):表示对资源的操作意图

  • 请求 URI(Request URI):资源路径,可包含查询参数

  • HTTP 版本:如 HTTP/1.1

HTTP 请求方法详解

方法 语义 幂等性 安全性 安全测试关注点
GET 获取资源 参数暴露在 URL 中(历史记录、Referer、日志泄露),可能存在敏感信息泄露;URL 长度限制(约 2048 字符)
POST 提交数据 请求体中的数据需验证是否存在注入点;Content-Type 类型混淆(如上传文件时修改 Content-Type 绕过检测)
PUT 替换/更新资源 可能涉及未授权文件上传/覆盖(如直接 PUT 到服务器路径),需测试权限控制
DELETE 删除资源 越权删除(如 DELETE /api/users/1 改为 DELETE /api/users/2),需测试权限控制
HEAD 获取响应头 用于探测服务器信息、验证资源存在性、进行目录爆破(不下载响应体,节省带宽)
TRACE 回显请求 存在 XST(Cross-Site Tracing)风险,可绕过 HttpOnly Cookie 保护,通常建议禁用
OPTIONS 查询支持的方法 可暴露服务器支持的功能(如 Allow: GET, POST, PUT, DELETE),扩大攻击面;CORS 预检请求使用
PATCH 局部更新 与 PUT 类似,需关注权限与输入验证;部分实现不规范可能导致漏洞
CONNECT 建立隧道 用于 HTTPS 代理,建立 SSL 隧道;可能被滥用进行端口扫描或绕过防火墙

幂等性:多次执行效果相同,不会产生副作用。GET、PUT、DELETE、HEAD、OPTIONS、TRACE 是幂等的。 安全性:不修改服务器资源。GET、HEAD、OPTIONS 是安全的。

HTTP 响应报文详解

报文结构

HTTP/1.1 200 OK                             ← 状态行(版本 + 状态码 + 原因短语)
Date: Sun, 07 Jun 2026 08:30:00 GMT         ← 响应头开始
Server: nginx/1.18.0
Content-Type: application/json; charset=utf-8
Content-Length: 256
Set-Cookie: sessionId=abc123; Path=/; HttpOnly; Secure; SameSite=Strict
X-Frame-Options: DENY
Content-Security-Policy: default-src 'self'
Strict-Transport-Security: max-age=31536000; includeSubDomains
Cache-Control: max-age=3600, must-revalidate
ETag: "686897696a7c876b7e"
                                            ← 空行
{"status": "success", "data": {...}}        ← 响应体(Body)

状态行详解

  • HTTP 版本:如 HTTP/1.1

  • 状态码(Status Code):3 位数字,表示请求处理结果

  • 原因短语(Reason Phrase):状态码的文本描述,如 OKNot Found

HTTP 状态码详解

状态码反映请求处理结果,安全测试中需关注状态码差异(信息泄露、认证绕过)。

1xx(信息响应)

  • 100 Continue:服务器已收到请求头,客户端应继续发送请求体。用于客户端发送大请求体前确认服务器是否接受

  • 101 Switching Protocols:服务器同意切换协议,如从 HTTP 升级到 WebSocket(Upgrade: websocket)

2xx(成功)

  • 200 OK:请求成功,响应体包含请求的资源

  • 201 Created:请求成功且资源已创建,通常用于 POST 请求创建资源后的响应

  • 202 Accepted:请求已接受但尚未处理完成,异步操作常用

  • 204 No Content:请求成功但无响应体,通常用于 DELETE 成功或 PUT 更新后无需返回数据的场景

  • 206 Partial Content:服务器成功处理了部分 GET 请求(Range 头部),用于断点续传、视频拖动播放

3xx(重定向)

  • 301 Moved Permanently:资源永久移动到新的 URL,搜索引擎应更新索引。响应头包含 Location: 新URL

  • 302 Found:资源临时移动到新的 URL,客户端应使用原 URL 继续访问。浏览器默认将 POST 转为 GET(历史行为)

  • 303 See Other:重定向到另一个资源,明确要求使用 GET 方法访问新 URL

  • 304 Not Modified:资源未修改,客户端可使用缓存副本。响应中不包含响应体

  • 307 Temporary Redirect:临时重定向,要求保持原请求方法(POST 仍为 POST)

  • 308 Permanent Redirect:永久重定向,要求保持原请求方法

安全测试注意:301/302 重定向的 Location 头若包含用户可控参数,可能导致开放重定向(Open Redirect)漏洞,被用于钓鱼攻击。

4xx(客户端错误)

  • 400 Bad Request:请求格式错误,服务器无法理解。可能触发异常处理逻辑,暴露调试信息

  • 401 Unauthorized:请求需要用户认证(未认证或认证失败)。响应头通常包含 WWW-Authenticate 指明认证方式

  • 403 Forbidden:服务器理解请求但拒绝执行(权限不足)。与 401 的区别:401 是未认证,403 是已认证但无权限

  • 404 Not Found:请求的资源不存在。可用于目录扫描(通过响应状态码差异判断目录是否存在)

  • 405 Method Not Allowed:请求方法不被允许(如服务器只允许 GET,但发送了 POST)。响应头包含 Allow 字段说明支持的方法

  • 406 Not Acceptable:请求的资源内容与 Accept 头中声明的格式不匹配

  • 408 Request Timeout:服务器等待客户端发送请求的时间过长

  • 409 Conflict:请求与服务器当前状态冲突(如并发修改冲突)

  • 410 Gone:资源曾经存在但已永久删除,比 404 更明确

  • 413 Payload Too Large:请求体过大,服务器拒绝处理

  • 414 URI Too Long:URI 过长,通常由 GET 请求参数过多导致

  • 415 Unsupported Media Type:请求体的 Content-Type 不被服务器支持

  • 429 Too Many Requests:请求过于频繁,触发速率限制。安全测试时需关注是否可通过 IP 伪造绕过

  • 451 Unavailable For Legal Reasons:因法律原因资源不可用(如版权、政府审查)

5xx(服务器错误)

  • 500 Internal Server Error:服务器内部错误,通用错误码。可能暴露堆栈信息、服务器路径、使用的框架等敏感信息

  • 501 Not Implemented:服务器不具备完成请求的功能(如不支持某方法)

  • 502 Bad Gateway:网关或代理从上游服务器收到无效响应。可能暴露后端架构(如 Nginx + PHP-FPM)

  • 503 Service Unavailable:服务器暂时过载或维护。Retry-After 头可告知客户端何时重试

  • 504 Gateway Timeout:网关或代理未能及时从上游服务器收到响应

  • 505 HTTP Version Not Supported:服务器不支持请求中使用的 HTTP 版本

HTTP 头部字段详解

HTTP 头部是元数据的载体,分为通用头、请求头、响应头、实体头。

通用头部(General Headers)

  • Cache-Control:缓存控制指令,如 no-cacheno-storemax-age=3600must-revalidateprivatepublic

  • Connection:连接管理,如 keep-alive(HTTP/1.1 默认)或 close

  • Date:消息创建时间

  • Transfer-Encoding:传输编码,如 chunked(分块传输)

  • Upgrade:协议升级,如 Upgrade: websocket(配合 Connection: Upgrade

请求头部(Request Headers)

  • Host:目标服务器域名和端口(HTTP/1.1 必需),用于虚拟主机区分

  • User-Agent:客户端标识(浏览器、操作系统、版本)。安全测试时可修改以模拟不同浏览器或爬虫

  • Accept:客户端可接受的 MIME 类型,如 text/htmlapplication/json*/*

  • Accept-Language:偏好的语言,如 zh-CN,zh;q=0.9,en;q=0.8

  • Accept-Encoding:支持的压缩编码,如 gzip, deflate, br。服务器据此压缩响应体,减少传输量

  • Referer:请求来源页面的 URL(注意拼写错误是历史遗留)。用于防盗链、CSRF 检测、访问统计。攻击者可伪造或删除此头

  • Cookie:客户端发送的 Cookie 键值对,是身份认证和攻击的关键载体

  • Authorization:认证凭证,常见格式:

  • Basic <base64(username:password)>:Base64 编码(非加密),易被解码

  • Bearer <token>:JWT 或 OAuth 访问令牌

  • Digest <...>:HTTP Digest 认证,比 Basic 安全

  • X-Forwarded-For:经过反向代理时,记录原始客户端 IP 链,如 X-Forwarded-For: 192.168.1.1, 10.0.0.1。可被伪造,不应直接用于访问控制

  • X-Real-IP:类似 X-Forwarded-For,但通常只记录最后一个代理前的 IP

  • Content-Type:请求体的 MIME 类型,如 application/jsonapplication/x-www-form-urlencodedmultipart/form-datatext/xml

  • Content-Length:请求体字节数

  • Origin:请求来源(协议 + 域名 + 端口),用于 CORS 预检请求,比 Referer 更简洁,不可伪造(浏览器控制)

  • If-None-Match:配合 ETag 使用,条件请求,如果资源未改变则返回 304

  • If-Modified-Since:配合 Last-Modified 使用,条件请求

  • Range:请求部分内容,如 Range: bytes=0-1023,用于断点续传

响应头部(Response Headers)

  • Server:服务器软件信息,如 Server: nginx/1.18.0。暴露版本号可辅助漏洞探测(如存在 CVE 漏洞的版本)

  • X-Powered-By:后端技术栈信息,如 X-Powered-By: PHP/7.4.3。扩大攻击面,建议隐藏

  • Set-Cookie:服务器向客户端设置 Cookie,支持多个安全属性:

  • Expires/Max-Age:Cookie 过期时间,未设置则为会话 Cookie(浏览器关闭即删除)

  • Domain:Cookie 适用的域名范围

  • Path:Cookie 适用的路径范围

  • HttpOnly:禁止 JavaScript 访问(document.cookie 无法读取),防御 XSS 窃取 Cookie

  • Secure:仅通过 HTTPS 传输,防止中间人窃取

  • SameSite:跨站请求时是否发送 Cookie。Strict(绝不发送)、Lax(顶级导航 GET 请求时发送,默认)、None(总是发送,需配合 Secure)。防御 CSRF 的关键属性

  • Location:重定向目标 URL,配合 3xx 状态码使用。若包含用户输入,可能导致开放重定向

  • Content-Security-Policy (CSP):前端安全策略,限制页面可加载的资源来源(脚本、样式、图片、连接等),是防御 XSS 的重要手段。例如:

  • default-src 'self':默认只允许同源资源

  • script-src 'self' 'nonce-abc123':只允许同源或带指定 nonce 的内联脚本

  • img-src *:允许任意来源的图片

  • frame-ancestors 'none':禁止页面被嵌入 iframe(防御点击劫持)

  • X-Frame-Options:控制页面是否可被嵌入 iframe。DENY(禁止)、SAMEORIGIN(仅同源允许)、ALLOW-FROM uri(特定来源允许)。防御点击劫持

  • Strict-Transport-Security (HSTS):强制浏览器在一段时间内(max-age)仅通过 HTTPS 访问该域名。includeSubDomains 包含所有子域名。防止 SSL 剥离攻击

  • X-Content-Type-Options: nosniff:禁止浏览器 MIME 类型嗅探,强制使用服务器声明的 Content-Type。防御 MIME 类型混淆攻击(如上传 .jpg 实际是 .js

  • Referrer-Policy:控制 Referer 头的发送策略,如 no-referrer(不发送)、strict-origin-when-cross-origin(跨站只发送来源域名)

  • Permissions-Policy:控制浏览器特性的使用权限,如 camera=(), microphone=(), geolocation=()

  • ETag:资源的实体标签,用于缓存验证。如资源改变则 ETag 改变

  • Last-Modified:资源最后修改时间,用于缓存验证

  • Cache-Control:缓存策略,如 max-age=3600(缓存 1 小时)、no-store(完全禁止缓存)、no-cache(使用前必须验证)、private(仅客户端缓存)、public(可被共享缓存)

  • WWW-Authenticate:401 响应中使用,告知客户端需要的认证方式,如 WWW-Authenticate: Basic realm="Admin Area"

  • Access-Control-Allow-Origin:CORS 响应头,声明允许的跨域来源。* 表示允许任意来源(不安全,且不能携带 Cookie)

  • Access-Control-Allow-Methods:允许的跨域方法

  • Access-Control-Allow-Headers:允许的跨域请求头

  • Access-Control-Allow-Credentials:是否允许跨域请求携带 Cookie(trueAccess-Control-Allow-Origin 不能为 *

HTTP 缓存机制详解

HTTP 缓存是提升性能的关键机制,也是安全测试需关注的领域(缓存投毒、敏感信息缓存)。

缓存类型

  • 私有缓存(Private Cache):浏览器本地缓存,仅当前用户使用。Cache-Control: private

  • 共享缓存(Shared Cache):CDN、代理服务器、反向代理缓存,多用户共享。Cache-Control: public

缓存策略

强缓存(Strong Cache)

  • 通过 Expires(HTTP/1.0,绝对过期时间)或 Cache-Control: max-age(HTTP/1.1,相对秒数)控制

  • 若强缓存生效,浏览器返回 200 OK (from memory cache)(from disk cache)

协商缓存(Conditional Cache)

  • ETag 机制:服务器返回 ETag: "686897696a7c876b7e",浏览器下次请求携带 If-None-Match: "686897696a7c876b7e"。若匹配则返回 304 Not Modified

  • Last-Modified 机制:服务器返回 Last-Modified: Sun, 07 Jun 2026 08:30:00 GMT,浏览器下次请求携带 If-Modified-Since。若未修改则返回 304

  • ETag 比 Last-Modified 更精确(可检测到秒级内的修改),但可能暴露服务器信息(如 ETag 包含 inode 号)

禁用缓存

  • Cache-Control: no-store:完全不存储任何版本

  • Cache-Control: no-cache:可以存储,但使用前必须向服务器验证

  • Pragma: no-cache(HTTP/1.0,向后兼容)

  • Expires: 0 或过去的时间

安全测试关注点

  • 缓存投毒(Cache Poisoning):通过构造恶意请求(如带特殊 Header)使缓存服务器存储并分发恶意内容给其他用户

  • 敏感信息缓存:包含敏感信息的页面(如个人资料)若未设置 Cache-Control: no-store,可能被浏览器或代理缓存,后续用户可访问

HTTPS 与 TLS 详解

HTTPS(HTTP Secure)是 HTTP over TLS/SSL 的简称,通过加密保证传输安全。

TLS 握手过程(TLS 1.2,基于 RSA)

  1. Client Hello:客户端发送支持的 TLS 版本、加密套件列表、随机数(Client Random)

  2. Server Hello:服务器选择 TLS 版本和加密套件,发送随机数(Server Random)和证书(含公钥)

  3. 客户端验证证书:检查证书链、有效期、域名匹配、是否被吊销(OCSP/CRL)

  4. 客户端生成 Pre-Master Secret:用服务器公钥加密后发送

  5. 双方生成 Master Secret:通过 Client Random + Server Random + Pre-Master Secret 计算得出

  6. 双方生成会话密钥:从 Master Secret 派生对称加密密钥和 MAC 密钥

  7. Finished:双方发送 Finished 消息,验证握手完整性,后续通信使用对称加密

TLS 1.3 改进

  • 握手流程简化,通常只需 1-RTT(甚至 0-RTT 恢复会话)

  • 废弃不安全的算法(MD5、SHA-1、RSA 密钥交换、CBC 模式等)

  • 仅支持 AEAD(Authenticated Encryption with Associated Data)加密模式

  • 前向安全(Forward Secrecy):即使长期私钥泄露,也无法解密历史会话

TLS 安全测试关注点

  • 协议降级攻击:强制服务器使用较弱的 TLS 版本(如 SSLv3)或算法套件

  • 证书问题:自签名证书、过期证书、域名不匹配、弱签名算法(SHA-1)

  • Heartbleed(CVE-2014-0160):OpenSSL 漏洞,可读取服务器内存中的敏感信息(私钥、Cookie、密码)

  • SSL/TLS 配置扫描:使用 testssl.sh、SSL Labs 检测支持的协议版本、密码套件、HSTS、证书链完整性

HTTP/2 与 HTTP/3 详解

HTTP/2 核心特性(RFC 7540,2015)

  • 二进制分帧(Binary Framing):HTTP/2 将数据分割为更小的帧(Frame),每帧包含类型、长度、标志和流标识符。帧类型包括 HEADERS、DATA、SETTINGS、PRIORITY、RST_STREAM、PING、GOAWAY、WINDOW_UPDATE、CONTINUATION

  • 多路复用(Multiplexing):单个 TCP 连接上可同时传输多个请求/响应流(Stream),每个流有唯一标识符。解决了 HTTP/1.1 的队头阻塞(Head-of-Line Blocking)问题

  • 头部压缩(HPACK):使用静态表、动态表和 Huffman 编码压缩头部,减少冗余传输。静态表包含 61 个常见头部字段,动态表根据通信历史动态调整

  • 服务器推送(Server Push):服务器可主动将客户端可能需要的资源(如 CSS、JS)推送至客户端,减少请求往返。但推送可能浪费带宽(客户端已有缓存),HTTP/3 中已弱化此功能

  • 流优先级(Stream Priority):客户端可设置流的优先级和依赖关系,让服务器优先传输重要资源

HTTP/2 安全测试关注点

  • HTTP/2 通常基于 TLS(h2),但也可明文传输(h2c)。明文传输下可被中间人攻击

  • HPACK 炸弹:构造极大动态表导致内存耗尽,拒绝服务

  • RST_STREAM 洪水:发送大量 RST_STREAM 帧导致服务器资源耗尽

  • 流并发限制:服务器通常限制并发流数量(如 100),超过可能被拒绝服务

HTTP/3 核心特性(RFC 9114,2022)

  • 基于 QUIC 协议:QUIC 构建在 UDP 之上,而非 TCP。将 TLS 1.3 集成到协议内部,减少握手延迟

  • 0-RTT 连接建立:对于已通信过的服务器,客户端可在第一个数据包中就发送应用数据,无需等待握手完成(存在重放攻击风险,需限制 0-RTT 数据类型)

  • 连接迁移:连接使用 64 位连接 ID 标识,而非 IP + 端口。当客户端网络切换(如 Wi-Fi → 4G)时,连接无需中断重建

  • 无队头阻塞:QUIC 在应用层实现多流复用,单个流的数据包丢失不会影响其他流,彻底解决 TCP 层的队头阻塞问题

  • 内置加密:QUIC 强制使用 TLS 1.3,无法明文传输

HTTP/3 安全测试关注点

  • 抓包工具(Wireshark、Burp Suite)需支持 QUIC 解密(需要 SSLKEYLOGFILE 环境变量导出密钥)

  • 0-RTT 重放攻击:攻击者截获 0-RTT 数据并重放,如果服务器未做防重放处理,可能导致非幂等操作被执行多次

  • 协议栈新攻击面:QUIC 实现复杂,可能存在新的协议实现漏洞

安全测试关联点

  • HTTP 方法测试:使用 OPTIONS 探测支持的方法;测试 PUT/DELETE 是否未授权;测试 TRACE 是否导致 XST

  • 状态码分析:通过状态码差异(如 403 vs 404)判断隐藏资源;通过 401/403 差异判断认证绕过可能性

  • 请求头伪造:修改 X-Forwarded-For 伪造 IP 绕过访问限制;修改 User-Agent 模拟搜索引擎绕过爬虫限制;删除或伪造 Referer 绕过防盗链/CSRF 检查

  • 响应头审查:检查安全响应头(CSP、HSTS、X-Frame-Options、X-Content-Type-Options)是否缺失;ServerX-Powered-By 是否暴露版本信息

  • Burp Suite:Web 安全测试的核心工具,用于拦截、修改、重放 HTTP 请求;Repeater 模块手工测试漏洞;Intruder 模块自动化爆破和 fuzzing;Scanner 模块自动扫描漏洞

  • HTTP 请求走私(HTTP Request Smuggling):利用前端代理和后端服务器对请求边界解析不一致(如 Content-Length vs Transfer-Encoding: chunked),将两个请求走私为一个,可能导致权限绕过、缓存投毒、会话劫持