第 16 章:连接安全、限流与输入边界
本章介绍限流、黑名单、背压、输入上限、TLS、鉴权和日志脱敏之间的配合关系。
1. 安全不是一个开关
STTNet 的安全能力由 TLS、连接/请求限流、发送背压、请求头上限、Worker 队列上限、业务鉴权和日志策略共同组成。打开 security_open 只能提供基础连接防护,不能替代认证、授权和输入验证。
2. ConnectionLimiter 的分层模型
- IP 层:并发连接、建连速率、风险评分、临时黑名单。
- fd 层:单连接请求速率、最后活动时间。
- path 层:对
/login、/register等敏感路径增加额外规则。
| 策略 | 特点 | 适合 |
|---|---|---|
| Cooldown | 触发后进入一段冷却时间 | 爆破、持续脚本重试 |
| FixedWindow | 简单、开销低,有窗口边界突刺 | 低风险统计型限制 |
| SlidingWindow | 任意时间窗更公平 | 公开 HTTP API |
| TokenBucket | 允许短时突发,限制长期平均 | 通用流量整形 |
3. 手动使用示例
using namespace stt::security;
ConnectionLimiter limiter(20, 60);
limiter.setRequestStrategy(RateLimitType::SlidingWindow);
limiter.setPathStrategy(RateLimitType::Cooldown);
limiter.setPathLimit("/login", 5, 60);
const DefenseDecision d = limiter.allowRequest(ip, fd, "/login", 100, 1);
if(d == DROP)
return; // 丢弃本次请求
if(d == CLOSE)
closeConnection(); // 外层负责真正关闭连接ConnectionLimiter 本身不加锁,适用于单一事件循环线程;多线程使用时由调用方提供同步。连接关闭时调用 clearIP(),以保持并发计数准确。
4. 服务端输入边界
- 最大 HTTP Header 和 Body 大小。
- 单连接待发送字节高水位,防止慢客户端拖垮内存。
- 单轮写预算,防止一个连接独占 Reactor。
- Worker 等待任务上限,防止下游变慢时无限堆积。
- TLS 证书校验和私钥权限。
- 对查询参数、JSON 字段、路径和上传文件做业务级验证。
5. 日志和密钥
日志中的 Authorization、Cookie、密钥、IV、私钥和完整请求体应脱敏。密钥通过权限受控的配置文件、环境注入或密钥管理系统提供,不写入源码仓库。