fix(v2): 限流按 socket 对端 IP(SetTrustedProxies(nil),伪造 XFF 失效)+ 桶 map 硬上限防 OOM

This commit is contained in:
wangjia
2026-07-10 18:52:27 +08:00
parent 8051b0fb16
commit d7bfa1b657
4 changed files with 132 additions and 0 deletions
+12
View File
@@ -37,6 +37,18 @@ func main() {
gin.SetMode(config.C.Server.Mode)
r := gin.New()
r.Use(gin.Logger(), gin.Recovery())
// 安全review发现:当前部署(阿里云单机,无 nginx/网关前置)不存在真实反向代理,
// 但 gin 默认 trustedProxies=0.0.0.0/0(信任任意来源的 X-Forwarded-For/X-Real-IP)。
// 不关掉的话,c.ClientIP() 会读客户端可控的请求头——攻击者每次伪造不同 XFF 即可
// 让限流中间件(internal/middleware/ratelimit.go)把每次请求都当"新 IP"的新桶,
// burst 永不触发,且伪造 IP 数量无上限还能撑爆 buckets map。
// SetTrustedProxies(nil) 让 engine.trustedCIDRs=nil → isTrustedProxy 恒 false →
// ClientIP() 退回 RemoteIP()(即 net/http 拿到的 socket 对端地址,请求头伪造不了)。
// 若未来加 nginx/API 网关反代,这里要改成该反代的真实出口 IP/CIDR 列表,
// 不能再传 nil(否则又会把加固之后合法的下游 IP 直接当客户端源用)。
if err := r.SetTrustedProxies(nil); err != nil {
log.Fatalf("SetTrustedProxies(nil) 失败: %v", err)
}
orderSvc := router.Setup(r, db, reg)