feat(server): 安全基线(Helmet+限流+脱敏)(E10)

- 注册 @fastify/helmet(CSP 关闭)
- 引入 @fastify/rate-limit,并对 login/forgot/reset 按开关启用
- Fastify logger 增加敏感字段 redaction(authorization/cookie/password 等)
这个提交包含在:
2026-02-08 23:58:55 +08:00
父节点 7597756fad
当前提交 479565f737
共修改 7 个文件,包含 124 行新增和 8 行删除
+12
查看文件
@@ -223,6 +223,9 @@ npm run job:ocr-once
- `STORAGE_DIR`: 默认 `generated/storage`(相对 `server/`)
- `SIGNED_URL_TTL_SECONDS`: 默认 `600`
- `MAX_UPLOAD_SIZE_BYTES`: 默认 `10485760`(10MB)
- `RATE_LIMIT_ENABLED`: 是否启用关键接口限流(默认:production=true,其它环境=false)
- `RATE_LIMIT_LOGIN_MAX`: `/api/auth/login` 等接口限流次数(默认 `10`)
- `RATE_LIMIT_LOGIN_WINDOW`: 限流时间窗(默认 `1 minute`,支持 ms 格式如 `30s`/`1m`)
- `DELEGATION_REVOKE_CRON`: 委派自动回收定时表达式(默认 `0 * * * *`)
- `OCR_PROVIDER`: `off` / `mock` / `tencent`(默认 `off`)
- `OCR_BATCH_SIZE`: 每轮 OCR 认领数量(默认 `10`)
@@ -232,6 +235,15 @@ npm run job:ocr-once
- `OCR_TIMEOUT_MS`: 腾讯 OCR SDK 超时(默认 `5000`)
- `TENCENT_SECRET_ID` / `TENCENT_SECRET_KEY` / `TENCENT_OCR_REGION`: 腾讯 OCR 配置
安全基线(P4):
- 安全头:默认启用 `@fastify/helmet`(CSP 默认关闭,避免误伤 SPA 本地调试)。
- 限流:`/api/auth/login`、`/api/auth/forgot-password`、`/api/auth/reset-password` 在 `RATE_LIMIT_ENABLED=true` 时启用限流。
- 日志脱敏:`authorization/cookie/password/code/newPassword` 等敏感字段会被 redaction。
回滚策略:
- 若限流误伤,可先设置 `RATE_LIMIT_ENABLED=false`(无需改代码)。
- 若安全头造成兼容性问题,可回退 `server/src/app.js` 中 helmet 注册逻辑。
> 生产提示:大表加索引需评估 `CREATE INDEX CONCURRENTLY`,避免锁表影响。
---