安全与防护
TLS、WAF 与 Bot 管理。
安全与防护
这一课你将能做到
- 配置 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>;