security: 新增全局限流 + 5xx 错误脱敏 + 兜底错误处理

- 内存级限流器(令牌桶):/api 全局 600/分;写接口单独限流(发帖10、评论20、组局申请20、举报5、上传30、下单20、支付30、充值/提现10、浏览1次/3秒);超限 429+Retry-After
- 5xx 统一脱敏:内部错误仅记服务端日志,对外返回“服务器内部错误”,不再回传 SQL/堆栈/内部原因
- 新增兜底错误处理中间件,避免 Express 默认 HTML 堆栈外泄
- 更新 upload 断言;新增回归护栏 ratelimit-5xx.spec.ts(90 套件/648 用例全绿);冒烟 7/7
- 文档补充限流与错误脱敏说明
这个提交包含在:
xcbyy
2026-10-19 13:50:51 +08:00
父节点 a61051fa96
当前提交 25d8474877
共有 4 个文件被更改,包括 123 次插入 和 15 次删除

查看文件

@@ -147,8 +147,12 @@ MYSQL_DATABASE=peiwan
- `40037` 排查:点后台「**拉取小程序模板列表(核对ID)**」,会显示当前 appId(脱敏)与其下真实存在的订阅消息模板;若后台填写的 ID 不在列表中,即为 appId 与建模板的小程序不一致(或用了公众号/服务号的模板ID)。用列表里的真实 ID 覆盖即可。
6. 订阅消息为**一次性**:用户授权一次只能收 1 条;高频场景需每次动作前请求授权(代码已在下单/报名/提现前请求)。
## 八、内容安全(可选)
### 限流与错误信息(已内置,无需额外配置)
- **全局限流**:`/api` 每 IP 600 次/分钟;**写接口单独限流**:发帖 10/分、评论 20/分、组局申请 20/分、举报 5/分、上传 30/分、下单 20/分、支付下单 30/分、充值/提现 10/分、浏览 1 次/3 秒(同 IP+动态)。超限返回 HTTP `429` + `Retry-After`。
- **5xx 脱敏**:服务端 5xx 只记录日志,对外统一返回「服务器内部错误,请稍后重试」,不再回传 SQL/堆栈等内部细节。
- 限流为**单实例内存级**;多实例部署时如需跨实例统一限流,需改用 Redis 计数(可选)。
## 八、内容安全(可选)
后台填入真实小程序 `appId` 与 32 位 `appSecret` 后,内容检测会真实调用微信 `msgSecCheck`;未配置时自动跳过远端、仅跑本地敏感词库(fail-open,不影响业务)。
## 九、回滚