协议
HTTP/HTTPS
HTTP
请求响应结构
- 起始行:方法(get post)路径 版本
- 头部:键值对,元数据(user-Agent Cookie Host)
- 主题body:实际数据
常见方法
- GET 从服务器获取资源,?id=1
- POST 向服务器提交数据。参数放在body里,更安全
状态码
- 1xx 信息性响应
- 2xx 成功 200 OK
- 3xx 重定向 301 永久移动 302 临时移动
- 4xx 客户端错误 403 forbidden 无权限 404notfound 对应资源找不到
- 5xx 服务器错误 500 Internal Server Error 后端崩溃 502 Bad Gateway 错误网关/连接超时
流量结构
请求结构
请求行,请求头,空行,请求体
POST /api/v1/login HTTP/1.1 <-- 1. 请求行 (Method, Path, Version) Host: example.com <-- 2. 请求头 (Headers) Content-Type: application/json Content-Length: 27 User-Agent: Mozilla/5.0 <-- 3. 空行 (CRLF, \r\n) {"username":"admin","pw":"123"} <-- 4. 请求体 (Body)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
- 请求行:
- Method (方法): `GET` (获取), `POST` (提交), `PUT` (更新), `DELETE` (删除), `OPTIONS` (预检)。
- Path (路径): 目标资源的 URL 路径及查询参数。
- Version (版本): `HTTP/1.1` 或 `HTTP/2`。
- 请求头: 键值对形式,告知服务器客户端的环境、预期的格式(Accept)、认证信息(Cookie/Authorization)等。
- 空行: 必须存在,用于标识 Header 结束和 Body 开始。
- 请求体: 实际传输的数据。`GET` 请求通常没有 Body。
- 响应结构
- ```
HTTP/1.1 200 OK <-- 1. 状态行 (Version, Status Code, Phrase)
Date: Sat, 10 Jan 2026 14:00:00 GMT <-- 2. 响应头
Server: Apache
Content-Type: text/html; charset=UTF-8
Content-Length: 155
<-- 3. 空行
<html> <-- 4. 响应体
<body>Hello World</body>
</html>
关键Header
- Cookie / Set-Cookie: 维持会话状态,是 CSRF 和会话劫持的核心。
- Referer / Origin: 标识请求来源,常用于 CSRF 防御。
- User-Agent: 客户端特征,常用于爬虫识别或漏洞精准投放。
- Content-Length / Transfer-Encoding: 涉及 HTTP 请求走私 (Request Smuggling) 漏洞的关键字段。
- X-Forwarded-For: 标识原始 IP(在经过代理/负载均衡时),常被用于绕过 IP 限制。
流程
输入http://www.baidu.com/123 后 发生了:
DNS解析
- 浏览器缓存——操作系统缓存——路由器缓存——ISP递归DNS。。。
- 可能发生DNS劫持
建立连接(TCP三次握手
- SYN: 客户端:“你好,我想连接你(序号 x)。”
- SYN-ACK: 服务端:“收到,我也准备好了(序号 y,确认号 x+1)。”
- ACK: 客户端:“太好了,那我们开始吧(确认号 y+1)。”
发送HTTP请求
GET /api/user HTTP/1.1 Host: http://www.baidu.com/123 Cookie: session_id=12345 User-Agent: Mozilla/5.0...
服务器处理并返回响应
HTTPS
HTTP是明文传输的,意味着任何中间人都能看到密码等敏感数据
HTTPS解决了以下问题:
机密性 (Confidentiality): 内容加密,中间人看不懂。
完整性 (Integrity): 内容不可篡改,改了就会被发现。
身份认证 (Authentication): 证明你访问的确实是真正的目标网站,而不是钓鱼网站。
流程
- 在三次握手之后 进行TLS握手
- Client发送支持的加密列表和随机数A
- Server发送选择好的加密算法,数字证书和随机数B
- 证书校验
- 浏览器检查证书是否过期,域名是否匹配,CA签名是否合法
- 证书包含CA的数字签名 使用CA的公钥解密能解开才通过完整性校验
- 生成预主密钥
- 浏览器从证书中获取公钥,生成随机数C 用公钥加密后发送给服务器
- 生成会话密钥Session key
- 现在都有ABC 双方通过协商好的算法 把这三个混合成一个会话密钥
- 开始对称加密通信
- 使用这个会话密钥加密http数据 进行传输
- 先用非对称协商密钥 再用对称快速通信
- 在三次握手之后 进行TLS握手

OWASP TOP 10
XSS
- Cross Site Scripting 网站中注入恶意脚本 导致浏览器执行任意代码(通常JS
- 反射型:服务端直接返回到html,存储在url参数里
- 存储型:存到数据库里,服务端读取后返回到html,危害大
- DOM型:不经过服务端,客户端js/url localstorage解析时触发
- 钓鱼 内网探测 配合CSRF 劫持表单 盗取cookie等
- 防御:
- 输出转义,HTML实体编码
- HttpOnly:禁止JS读取cookie 防止窃取
- 内容安全CSP:限制域名白名单,禁止内敛脚本等
- 输入验证
CSRF
- Cross-site Request Forgery 跨站请求伪造
- 核心是网站对用户浏览器的信任,攻击者诱导受害者访问一个恶意页面,该页面利用浏览器自动携带cookie的特性来获取cookie 导致盗号等,本质是利用用户权限来进行非法操作
- 防御
- Anti-CSRF token 服务器嵌入一个随机生成的token,客户端请求时必须携带该token。攻击者无法获取这个token 无法伪造请求
- 属性:将Cookie设置为
SameSite=Lax或Strict,限制第三方网站请求携带 Cookie。 - 验证Referer/Origin:检查请求来源是否可信(可以主动隐藏, )https跳http也会丢失referrer
- 二次验证,短信验证码/支付密码
SSRF
- Server-Side Request Forgery 服务端请求伪造
- 核心原理是:攻击者利用服务端提供了“从外部获取资源”的功能(如图片上传、URL 预览),伪造请求让服务器去访问其内网资源。
攻击目标: 绕过防火墙,探测服务器所在的内部网络、读取敏感配置文件、攻击内网其他脆弱服务。
- 核心原理是:攻击者利用服务端提供了“从外部获取资源”的功能(如图片上传、URL 预览),伪造请求让服务器去访问其内网资源。
- 防御
- 黑名单 白名单限制协议,域名,ip等
- 验证内网ip
- 防止DNS重绑定:直接对校验过的ip发起连接
- 网络隔离:业务服务器和内网隔离
SQL注入
- 数据与命令未分离,用户输入直接拼接进SQL语句里导致的非法执行
- 联合注入 UNION SELECT
- 报错注入
- 盲注:布尔盲注 时间盲注
- 宽字节注入
- 原理:当后端使用
addslashes等函数转义单引号时('变为\'),如果数据库编码是 GBK,攻击者输入%df%27。转义后变成%df%5c%27。由于 GBK 认为%df%5c是一个汉字,导致反斜杠被“吃掉”,单引号逃逸。 - 防御:使用
mysql_set_charset('gbk')统一字符集,或直接使用 预编译。
- 原理:当后端使用
- 二次注入
- 原理:第一步攻击者输入的恶意数据经过转义存储到了数据库中(此时是安全的)。第二步,程序再次调用该数据并拼接到另一个 SQL 语句中执行,此时恶意数据生效。
- 防御:永远不要信任从数据库里取出的数据,二次调用时依然要进行预编译或转义。
- 所有参数都可以预编译吗?
- 不可以! 预编译只能处理 占位符(Data Literal)。
- 无法预编译的场景:
ORDER BY [字段名]、GROUP BY、LIMIT、表名、列名。 - 解决方案:这些位置必须使用 白名单 校验,或强制类型检查
- 现在哪还有sql注入啊。。
密码学
AES
- 分组密码,每次处理16字节
- 工作模式
- ECB 每个块独立加密,可以明文统计
- CBC 每个块与前一个密文块xor 再加密
- CTR 对一个递增的计数器加密 再与明文xor (iv不可重复
- GCM :CTR+GMAC消息验证码,有密文防篡改 推荐使用
对称加密 V.S 非对称加密

非对称加密主要依靠复杂的数学难题(大数分解,椭圆曲线点运算)来实现
- C = E_publickey(P), P = D_privatekey(C)
RSA
- 基于大数分解
- 至少需要2048位才安全
- 核心步骤
- 选两个超大质数pq 计算n = pq
- 计算phi(n) = (p-1)(q-1)
- 公钥e 与phi(n)互质
- 计算 e 关于phi(n) 的模反元素私钥d

- 这样就有了公钥对n e 私钥对n d

ECC
定义曲线:例如常见的 y^2 = x^3 + ax + b。
基点 G:曲线上一个已知的点。
私钥 k:一个巨大的随机数。
公钥 K:通过“标量乘法”计算出的点 K = kG。
Diffie-Hellman
