fix(v2): 限流按 socket 对端 IP(SetTrustedProxies(nil),伪造 XFF 失效)+ 桶 map 硬上限防 OOM
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user