大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
安全与防护
这一课你将能做到
- 配置 Cloudflare WAF 规则拦截 SQL 注入、XSS、路径遍历等常见攻击
- 使用 Worker 实现 JWT 鉴权、速率限制(Rate Limiting)、IP 黑白名单
- 理解 TLS 加密、Bot 管理、DDoS 防护的基本原理和配置方式
为什么要学
你的 API 上线第一天就被人扫了:有人尝试 /admin、.env、wp-login.php;有人写脚本每秒发 1000 个请求想压垮你的服务器;还有人在登录接口尝试 SQL 注入。没有安全防护,你的应用就像裸奔。
人话:Cloudflare 的安全体系是「边缘拦截」——攻击流量还没到你的源站,就在边缘节点被拦住了。WAF 是防火墙,Rate Limiting 是限流器,Bot Management 是机器人识别,TLS 是加密通道。这套组合拳打下来,90% 的自动化攻击都会被挡在门外。
先建立图像
恶意请求 正常用户
│ │
▼ ▼
[Cloudflare Edge Node]
│
├── [WAF] ──> SQL注入? XSS? ──> 拦截 403
│
├── [Rate Limiting] ──> 超过 100 req/min? ──> 拦截 429
│
├── [Bot Management] ──> 是爬虫? ──> 挑战验证 / 拦截
│
└── [TLS 加密] ──> 中间人攻击? ──> 加密通道
│
▼
[你的源站 / Worker]
跟着做
步骤 1:配置 WAF 规则
Dashboard → Security → WAF → Custom Rules → Create Rule:
- 规则名:Block SQL Injection
- 字段:URI Query String
- 操作符:contains
- 值:
union select(或drop table、insert into等) - 动作:Block
保存后,任何包含这些关键词的请求都会返回 403。
步骤 2:Worker 实现 JWT 鉴权
import { verify } from 'hono/jwt';
export interface Env {
JWT_SECRET: string;
}
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const authHeader = request.headers.get('Authorization');
if (!authHeader?.startsWith('Bearer ')) {
return new Response('Unauthorized', { status: 401 });
}
const token = authHeader.slice(7);
try {
const payload = await verify(token, env.JWT_SECRET);
// 鉴权通过,继续处理业务
return Response.json({ userId: payload.sub, role: payload.role });
} catch (err) {
return new Response('Invalid token', { status: 401 });
}
},
} satisfies ExportedHandler<Env>;
步骤 3:Worker 实现速率限制
用 KV 做简单的滑动窗口限流:
export interface Env {
RATE_LIMIT_KV: KVNamespace;
}
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const ip = request.headers.get('CF-Connecting-IP') ?? 'unknown';
const key = `rate:${ip}`;
const current = await env.RATE_LIMIT_KV.get(key);
const count = current ? parseInt(current) : 0;
if (count > 100) {
return new Response('Too Many Requests', { status: 429 });
}
await env.RATE_LIMIT_KV.put(key, (count + 1).toString(), { expirationTtl: 60 });
return Response.json({ remaining: 100 - count - 1 });
},
} satisfies ExportedHandler<Env>;
步骤 4:配置 TLS
Dashboard → SSL/TLS → Overview:
- 加密模式:Full (Strict)——源站必须有有效证书,推荐
- 最低 TLS 版本:TLS 1.2
- TLS 1.3:开启
- 自动 HTTPS 重写:开启
步骤 5:Bot 管理(基础版)
Dashboard → Security → Bots:
- Bot Fight Mode:开启(免费)
- Verified Bots:允许(Google、Bing 等搜索引擎)
讲清楚要点
- WAF 规则越具体越好:不要只写
contains "select",这会误杀正常请求。要匹配完整的攻击模式,如union select、' or '1'='1。 - Rate Limiting 在边缘做:Cloudflare 自带的 Rate Limiting Rules(付费)比 Worker 里的 KV 限流更可靠、性能更好。Worker 限流适合自定义逻辑(如按用户 ID 限流)。
- TLS Full (Strict) 是必须的:Flexible 模式(浏览器到 CF 加密,CF 到源站不加密)有中间人攻击风险。Strict 要求源站有有效证书,可以用 Cloudflare Origin CA 免费签发。
- Bot Management 是 AI 驱动的:不是简单的 User-Agent 匹配,而是行为分析(鼠标移动、点击模式、请求频率)。免费版 Bot Fight Mode 能拦住大部分低级爬虫。
- DDoS 防护是默认开启的:Cloudflare 的 Anycast 网络天然分散 DDoS 流量。L3/L4 层攻击自动吸收,L7 层需要 WAF + Rate Limiting 配合。
你可能会懵的地方
-
WAF 会误杀正常请求吗? 会。比如用户搜索「how to select from database」,如果 WAF 规则只匹配
select,就会误杀。解决方法:规则要精确,或者用「跳过规则」给特定路径豁免。 -
Rate Limiting 会不会误杀爬虫? 会。Google 爬虫的 IP 会被限流。解决方法:把已验证的搜索引擎 IP 加入白名单,或开启 Verified Bots 允许。
-
Worker 里怎么获取真实 IP?
request.headers.get('CF-Connecting-IP')。不要用X-Forwarded-For,它可以伪造。 -
TLS 1.3 和 1.2 有什么区别? TLS 1.3 握手更快(1-RTT vs 2-RTT),更安全(移除了不安全的加密套件)。建议开启,但保留 1.2 兼容旧设备。
-
DDoS 防护要额外付费吗? L3/L4 层 DDoS 防护免费且默认开启。L7 层(HTTP 层)的精细防护需要 WAF 和 Rate Limiting,部分功能付费。
错法对照
| 错法 | 问题 | 正解 |
|---|---|---|
用 X-Forwarded-For 获取 IP | 可以伪造,绕过限流 | 用 CF-Connecting-IP |
| TLS 模式设为 Flexible | CF 到源站明文传输,可被中间人攻击 | 设为 Full (Strict) |
| Rate Limiting 按 IP 一刀切 | 公司/学校 NAT 出口 IP 被误杀 | 按用户 ID + IP 组合限流,或给白名单 |
WAF 规则只写 select | 误杀正常搜索请求 | 匹配完整攻击模式,如 union select |
| 把 JWT Secret 硬编码在代码里 | 代码泄露导致所有 token 可被伪造 | 用 wrangler secret put 存储 |
卡点急救
- WAF 规则不生效:检查规则是否已启用;检查规则优先级(数字越小优先级越高);用 Security Events 查看请求是否被拦截。
- Rate Limiting 返回 429 但用户是正常用户:IP 可能是共享出口(公司/学校)。降低阈值,或改用按用户 ID 限流。
- TLS 证书错误:确认源站证书有效;如果是自签名证书,把 TLS 模式设为 Full(不验证证书链),但仍有中间人风险。
面试常问
-
Cloudflare 的 DDoS 防护原理? Anycast 网络把流量分散到全球 300+ 节点,攻击流量被稀释。L3/L4 层自动吸收;L7 层通过 WAF 规则、Rate Limiting、Bot 管理识别和拦截恶意 HTTP 请求。
-
WAF 和 Rate Limiting 的区别? WAF 是「内容过滤」:根据请求内容(SQL 注入、XSS)拦截;Rate Limiting 是「频率控制」:根据请求频率(每秒多少次)拦截。两者互补。
-
JWT 鉴权在 Worker 里怎么做? 用
hono/jwt或jose库验证 token 签名和过期时间。Secret 用wrangler secret put存储,不要硬编码。验证通过后再访问下游资源。
自测三问
- 为什么
CF-Connecting-IP比X-Forwarded-For更可靠? - TLS Full (Strict) 和 Flexible 的核心区别是什么?为什么 Strict 更安全?
- 如果用户反馈「搜索 select 相关关键词被拦截」,你会怎么排查?
小结一句话
Cloudflare 安全体系是「边缘拦截」:WAF 拦内容攻击、Rate Limiting 拦频率攻击、Bot Management 拦机器人、TLS 保证传输加密,四层防护把 90% 的威胁挡在源站之外。
延伸
- WAF 官方文档
- Rate Limiting 官方文档
- Bot Management 官方文档
- 下一课:运维与集成,学习 CI/CD、日志监控、Pages 与 Service Bindings。