From 0752acda400f290b329aeae7a939b3cefe901392 Mon Sep 17 00:00:00 2001 From: xcbyy <2578898740@qq.com> Date: Mon, 19 Oct 2026 13:51:27 +0800 Subject: [PATCH] =?UTF-8?q?fix(ratelimit):=20=E5=85=A8=E5=B1=80=E9=99=90?= =?UTF-8?q?=E6=B5=81=E6=94=B9=E4=B8=BA=E4=BC=98=E5=85=88=E6=8C=89=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=88=86=E6=A1=B6=E5=B9=B6=E6=8C=89=201200/=E5=88=86?= =?UTF-8?q?=E6=94=BE=E5=AE=BD=EF=BC=8C=E9=81=BF=E5=85=8D=E5=8F=8D=E4=BB=A3?= =?UTF-8?q?=E6=9C=AA=E9=80=8F=E4=BC=A0=20XFF=20=E6=97=B6=E5=85=A8=E7=AB=99?= =?UTF-8?q?=E8=AF=AF=E4=BC=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/部署验收与1分钱支付闭环.md | 7 ++++++- server/src/index.ts | 5 +++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/docs/部署验收与1分钱支付闭环.md b/docs/部署验收与1分钱支付闭环.md index 573d8ba..f2c0458 100644 --- a/docs/部署验收与1分钱支付闭环.md +++ b/docs/部署验收与1分钱支付闭环.md @@ -148,7 +148,12 @@ MYSQL_DATABASE=peiwan 6. 订阅消息为**一次性**:用户授权一次只能收 1 条;高频场景需每次动作前请求授权(代码已在下单/报名/提现前请求)。 ### 限流与错误信息(已内置,无需额外配置) -- **全局限流**:`/api` 每 IP 600 次/分钟;**写接口单独限流**:发帖 10/分、评论 20/分、组局申请 20/分、举报 5/分、上传 30/分、下单 20/分、支付下单 30/分、充值/提现 10/分、浏览 1 次/3 秒(同 IP+动态)。超限返回 HTTP `429` + `Retry-After`。 +- **全局限流**:`/api` 每**用户**(未登录按 IP)1200 次/分钟;**写接口单独限流**:发帖 10/分、评论 20/分、组局申请 20/分、举报 5/分、上传 30/分、下单 20/分、支付下单 30/分、充值/提现 10/分、浏览 1 次/3 秒(同 IP+动态)。超限返回 HTTP `429` + `Retry-After`。 +- ⚠️ **反向代理务必透传真实客户端 IP**,否则限流会把所有用户并成一个 IP 桶: + ```nginx + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Real-IP $remote_addr; + ``` - **5xx 脱敏**:服务端 5xx 只记录日志,对外统一返回「服务器内部错误,请稍后重试」,不再回传 SQL/堆栈等内部细节。 - 限流为**单实例内存级**;多实例部署时如需跨实例统一限流,需改用 Redis 计数(可选)。 diff --git a/server/src/index.ts b/server/src/index.ts index b006812..305310b 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -109,8 +109,9 @@ function rateLimit(opts: { name: string; windowMs: number; max: number; key?: (r }; } -// 全局限流(宽松,主要抵御暴力刷接口/爬取) -app.use('/api', rateLimit({ name: 'global', windowMs: 60 * 1000, max: 600 })); +// 全局限流(宽松,主要抵御暴力刷接口/爬取)。优先按登录用户分桶,未登录退化到 IP, +// 避免反向代理未透传 X-Forwarded-For 时全站用户共用同一 IP 桶被误伤。 +app.use('/api', rateLimit({ name: 'global', windowMs: 60 * 1000, max: 1200, key: rateWriteKey })); // 写接口限流键:优先按登录用户,未登录退化到 IP function rateWriteKey(req: Request): string {