以下是第一周周三学习内容的详细展开聚焦 HTTP/HTTPS 协议涵盖请求方法、URL 结构和报文格式并延续安全视角。第一周·周三HTTP/HTTPS 协议、请求方法与报文格式 今日学习目标达成效果能完整说出HTTP 协议的无状态、明文传输特点以及 HTTPS 如何解决其安全问题能正确区分GET 与 POST 等至少 4 种常见请求方法的作用与区别能拆解并解释一个完整 URL 的各部分协议、主机、端口、路径、查询参数、锚点能读懂并写出HTTP 请求报文和响应报文的结构准确识别起始行、头部、空行、主体能使用 curl手动构造并发送 GET 和 POST 请求观察完整的请求与响应能从安全角度指出 HTTP 明文传输带来的风险以及 HTTPS 加密和证书的作用。 一、HTTP 协议基础HTTP超文本传输协议是万维网数据传输的基础工作在应用层下层依靠 TCP 提供可靠传输HTTP/3 使用 QUIC/UDP但初学阶段以 HTTP/1.1 和 HTTP/2 为主。HTTP 三大核心特性无状态每个请求都是独立的服务器不会自动保存客户端的上下文。为了维持登录状态网站需要额外引入 Cookie / Session / Token 机制明天会详细讲解。明文传输HTTP 最大安全隐患标准 HTTP 报文未经加密所有信息包括密码、敏感数据都以明文在网络上传输。任何能够截获网络流量的攻击者都能直接读取。这是后续学习中间人攻击MITM和抓包分析的根本原因。请求-响应模型通信必须由客户端发起请求服务器被动返回响应。服务器无法主动向客户端推送数据直到 WebSocket 等技术出现前。 二、HTTPS 安全基础HTTPS HTTP TLS/SSL 传输层安全/安全套接层。它在 HTTP 下面加入了加密层加密传输对报文进行加密防止窃听和篡改。身份验证通过 SSL 证书确认服务器身份防止 DNS 劫持等攻击。数据完整性通过消息验证码MAC防止数据在传输中被修改。安全视角渗透测试中经常遇到未启用 HTTPS 的登录页面密码可被直接抓取。但 HTTPS 并非绝对安全存在证书伪造、SSL Strip 等降级攻击后续会涉及。今天只需建立“HTTP 明文不安全HTTPS 加密更安全”的基本认知。简要流程客户端向服务器发起 HTTPS 请求默认 443 端口。服务器返回公钥证书包含公钥和域名。客户端验证证书合法性CA 信任链、域名匹配、未过期等。双方协商生成临时对称会话密钥之后全部数据用该密钥加密通信。初学者务必记住HTTPS 保障的是“传输过程”安全而非网站本身没有漏洞证书只证明身份不担保网站无害。 三、URL 结构拆解URL统一资源定位符是定位网络资源的完整地址标准格式如下协议://用户名:密码主机名:端口/路径?查询参数#片段举例https://www.example.com:8443/login?useradmin#step1协议https指明访问方式http、ftp、mailto 等。认证信息可选user:passHTTP 基本认证会用到现已少见。主机名www.example.com通过 DNS 解析为 IP 地址。端口:8443默认端口可省略http 80https 443。路径/login指定服务器上的资源路径可以模拟目录结构。查询参数Query String?useradmin以键值对形式发送额外参数多参数用连接如?useradminpass123。片段Fragment#step1用于定位页面内部锚点不会被发送到服务器只在浏览器端生效。安全视角查询参数中的敏感信息如密码会直接暴露在 URL 中可能被浏览器历史记录、服务器日志、Referer 头泄露。渗透测试中常通过修改 URL 参数进行注入、越权测试。 四、常见请求方法HTTP MethodsHTTP 定义了一系列请求方法用来表达对资源的操作意图。方法含义是否安全是否幂等请求体GET获取资源是是无参数在URLPOST提交数据创建/修改否否通常有PUT完整替换指定资源否是有DELETE删除指定资源否是可能无HEAD同GET但只返回头部是是无OPTIONS查询支持的请求方法是是无PATCH部分修改资源否否有安全/幂等说明安全指该请求不应对服务器数据造成修改仅用于获取信息GET、HEAD、OPTIONS。幂等多次执行相同请求结果与执行一次相同。GET、PUT、DELETE 都是幂等的但 POST 不幂等多次 POST 可能会创建多个资源。重点对比 GET 与 POST面试常考GET 参数拼接在 URL 中有长度限制其实浏览器和服务器限制不同但一般理解上 GET 不能提交大数据安全性较差POST 参数放在请求体中相对隐蔽但仍需加密才能保证安全。GET 请求可被缓存、可被保存为书签POST 不能。安全本质都不安全POST 数据在明文 HTTP 下同样可被窃取只是不在浏览器地址栏显示而已。 五、HTTP 请求报文与响应报文结构1. HTTP 请求报文POST /login HTTP/1.1 ← 起始行方法 路径 HTTP版本 Host: www.example.com ← 头部字段 User-Agent: Mozilla/5.0 ... Content-Type: application/x-www-form-urlencoded Content-Length: 28 Cookie: PHPSESSIDabc123 ← 空行必须分隔头部和主体 usernameadminpass123 ← 请求主体起始行必须包含三个元素方法、请求目标路径、HTTP 版本。头部包含诸多键值对传达客户端信息、期望的响应格式等。常见头部Host目标主机名HTTP/1.1 必须可用于虚拟主机区分。User-Agent浏览器/客户端类型。Accept、Accept-Language、Accept-Encoding客户端能处理的响应类型。Cookie向服务器发送本地保存的会话信息。Content-Type请求主体的 MIME 类型常见的有application/x-www-form-urlencoded表单默认提交格式multipart/form-data文件上传时使用application/jsonContent-Length请求主体的字节数。空行仅一个 CRLF 换行之后就是请求主体对于 GET 请求通常没有主体。2. HTTP 响应报文HTTP/1.1 200 OK ← 状态行HTTP版本 状态码 原因短语 Server: nginx Content-Type: text/html; charsetUTF-8 Content-Length: 128 Set-Cookie: sessionidxyz456; HttpOnly; Secure ← 空行 html bodyWelcome!/body /html状态行包含状态码如 200、404和简短说明。响应头Content-Type告知响应体类型浏览器据此渲染Set-Cookie用于让客户端设置 CookieLocation用于重定向等。空行后为响应主体。安全视角Server头可能泄露服务器软件及版本增加攻击面。Set-Cookie中的HttpOnly标记可防止 JavaScript 读取 CookieSecure标记限制 Cookie 仅 HTTPS 传输这些是重要的防御手段。抓包分析的第一步就是查看这些头部判断框架、泄漏信息。✍️ 六、动手实践使用 curl 和浏览器开发者工具目标今天必须亲手发送 HTTP 请求并观察报文结构不要停留在阅读上。实践 1用 curl 发送 GET 请求观察完整通信打开终端Linux/Mac 自带Windows 可安装 Git Bash 或 WSL执行curl-vhttp://example.com-vverbose会显示请求和响应的详细过程包括头部和 TLS 握手信息HTTPS 时。你将看到起始行 GET / HTTP/1.1请求头部 Host: example.com等响应状态行 HTTP/1.1 200 OK响应头部 Content-Type: text/html等响应主体HTML 源码思考为什么请求里有Host头部没有它会怎样再试一个带参数的 GET 请求curl-vhttp://example.com/search?qtestpage2观察 URL 参数如何体现在请求行中。实践 2用 curl 发送 POST 请求curl-v-XPOST http://example.com/login-dusernameadminpassword123-HContent-Type: application/x-www-form-urlencoded-X POST指定方法-d发送数据自动使用 POST 方法并添加Content-Type: application/x-www-form-urlencoded观察请求头部多了Content-Length和Content-Type以及主体内容实践 3浏览器开发者工具Network 面板打开 Chrome / Firefox按 F12 进入开发者工具切换到Network网络标签。访问任意网页推荐用 HTTP 网站以避免直接跳转 HTTPS或开启 HTTPS 依然观察。点击第一个文档类型的请求通常是页面 HTML查看Headers→ General请求 URL、请求方法、状态码Request Headers请求头完整列表Response Headers响应头PayloadPOST 请求时显示表单数据或JSONResponse标签页查看响应体尝试找到设置 Cookie 的头部Set-Cookie以及请求时发回的Cookie。安全实验可选如果你有自己的实验环境可以尝试用 curl 访问一个不支持 HTTPS 的 HTTP 站点配合 Wireshark明天会重点练抓包观察用户名密码的明文传输。今天只需理解原理。 七、课后测试题与解析测试题 1写出一个完整的 HTTP POST 请求报文包含主机头、Content-Type 和两个表单参数用户名、密码。参考答案POST /api/login HTTP/1.1 Host: www.test.com Content-Type: application/x-www-form-urlencoded Content-Length: 32 usernameadminpasswordP%40ssw0rd注意实际密码中的被 URL 编码为%40但正文中可以直接写特殊字符为了安全也可编码。测试题 2GET 和 POST 请求的区别有哪些至少写出三点参考答案GET 参数在 URL 中POST 参数在请求体中GET 请求可被缓存、保存为书签、出现在浏览器历史记录里POST 不行GET 对数据长度有限制受限于 URL 长度POST 传输数据量更大GET 是安全和幂等的POST 既不安全也不幂等多次 POST 可能产生多个资源GET 主要用于获取数据POST 主要用于提交数据。测试题 3HTTPS 相比 HTTP 增加了什么它是否能保证网站本身没有漏洞参考答案HTTPS 在 HTTP 下增加了 TLS/SSL 加密层提供加密传输防窃听服务器身份验证证书数据完整性校验防篡改。它不能保证网站本身没有漏洞只是让通信过程更安全。网站代码的注入漏洞、逻辑漏洞等依然存在只是攻击者更难在传输途中截获或修改数据。✅ 今日学习效果自检清单我能画出 HTTP 请求和响应的报文结构起始行、头、空行、主体我能用 curl 发送 GET 和 POST 请求并用 -v 查看所有头部信息我能指出 URL 中协议、主机、端口、路径、查询参数和片段的位置我能说出至少 4 种 HTTP 请求方法及其作用我理解“无状态”的含义以及为什么需要 Cookie/Session明天将学我能解释为什么 HTTP 明文传输是安全问题以及 HTTPS 如何解决它我能在浏览器开发者工具 Network 面板中找到请求头、响应头和数据主体⚠️ 阶段避坑重点不要只背 GET 和 POST 的字面区别要落实到报文结构上亲眼看一看 POST 的主体和 GET 的查询参数在 Request 中实际的样子。不要把 POST 当“加密”手段POST 参数在 HTTP 下依然是明文的只是不在地址栏显示。只有 HTTPS 才能保护传输过程。不要混淆请求头的用途Content-Type是告诉服务器“我传给你的是什么格式”而Accept是告诉服务器“我能接收什么格式”。不要忽视空行的作用头部和主体之间必须有一个空行它是解析分割的标志很多手工构造报文失败就是因为少了一个换行符。明天周四我们将学习 HTTP 状态码与 Cookie/Session/Token 机制今天抓到的报文中已经出现了状态码和Set-Cookie请保留实验环境明天会直接在这些报文上分析。