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):状态码的文本描述,如
OK、Not 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-cache、no-store、max-age=3600、must-revalidate、private、public -
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/html、application/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/json、application/x-www-form-urlencoded、multipart/form-data、text/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(true时Access-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)¶
-
Client Hello:客户端发送支持的 TLS 版本、加密套件列表、随机数(Client Random)
-
Server Hello:服务器选择 TLS 版本和加密套件,发送随机数(Server Random)和证书(含公钥)
-
客户端验证证书:检查证书链、有效期、域名匹配、是否被吊销(OCSP/CRL)
-
客户端生成 Pre-Master Secret:用服务器公钥加密后发送
-
双方生成 Master Secret:通过 Client Random + Server Random + Pre-Master Secret 计算得出
-
双方生成会话密钥:从 Master Secret 派生对称加密密钥和 MAC 密钥
-
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)是否缺失;
Server和X-Powered-By是否暴露版本信息 -
Burp Suite:Web 安全测试的核心工具,用于拦截、修改、重放 HTTP 请求;Repeater 模块手工测试漏洞;Intruder 模块自动化爆破和 fuzzing;Scanner 模块自动扫描漏洞
-
HTTP 请求走私(HTTP Request Smuggling):利用前端代理和后端服务器对请求边界解析不一致(如 Content-Length vs Transfer-Encoding: chunked),将两个请求走私为一个,可能导致权限绕过、缓存投毒、会话劫持