STTNet 0.7.0

第 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、私钥和完整请求体应脱敏。密钥通过权限受控的配置文件、环境注入或密钥管理系统提供,不写入源码仓库。

完整限流 Demo →