Skip to content

安全概述

HTTPC 默认安全(Secure by Default),所有安全特性开箱即用。

安全特性总览

特性默认说明
TLS 最低版本TLS 1.2拒绝 TLS 1.0/1.1
SSRF 防护开启阻止私有 IP 连接
URL 验证开启验证 URL 格式和协议
请求头验证开启防止 CRLF 注入
Content-Length 严格检查开启防止响应走私
Cookie 安全验证可选验证 Cookie 安全属性
响应体大小限制10MB防止内存耗尽
解压体大小限制100MB防止解压炸弹
重定向限制10 次防止无限重定向

TLS 安全

go
cfg := httpc.DefaultConfig()
// 默认 TLS 1.2-1.3
cfg.Security.MinTLSVersion = tls.VersionTLS12
cfg.Security.MaxTLSVersion = tls.VersionTLS13

DANGER

InsecureSkipVerify 仅用于测试。生产环境永远不要设为 true

SSRF 防护

SSRF(服务端请求伪造)是攻击者利用服务器发起内网请求的攻击方式。

go
// 默认:阻止私有 IP
cfg := httpc.DefaultConfig()
// AllowPrivateIPs = false → 阻止 127.0.0.1, 10.x, 192.168.x 等

// 豁免特定 CIDR(如 VPN、VPC)
cfg.Security.SSRFExemptCIDRs = []string{
    "10.0.0.0/8",       // VPC 内部
    "100.64.0.0/10",    // Tailscale
}

// 安全预设:最强 SSRF 防护
client, _ := httpc.New(httpc.SecureConfig())

被阻止的 IP 范围

范围说明
127.0.0.0/8回环地址
10.0.0.0/8A 类私有
172.16.0.0/12B 类私有
192.168.0.0/16C 类私有
169.254.0.0/16链路本地
::1/128IPv6 回环
fc00::/7IPv6 唯一本地
fe80::/10IPv6 链路本地

请求头验证

自动防止 CRLF 注入和请求头走私:

go
// 以下请求头会被拒绝
httpc.WithHeader("X-Custom", "value\r\nInjected: header") // CRLF 注入
httpc.WithHeader("X-Bad", "value\x00null")                // 控制字符
go
// 严格 Cookie 安全
cfg := httpc.DefaultConfig()
cfg.Security.CookieSecurity = httpc.StrictCookieSecurityConfig()
// 要求: Secure, HttpOnly, SameSite=Strict

重定向安全

go
// 禁止重定向(安全敏感场景)
cfg := httpc.SecureConfig() // FollowRedirects = false

// 限制重定向域名
cfg := httpc.DefaultConfig()
cfg.Security.RedirectWhitelist = []string{
    "api.example.com",
    "auth.example.com",
}

审计中间件

go
auditMiddleware := httpc.AuditMiddleware(func(event httpc.AuditEvent) {
    // URL 已脱敏(凭据已移除)
    log.Printf("[AUDIT] %s %s -> %d (%v)",
        event.Method, event.URL, event.StatusCode, event.Duration)
})

cfg := httpc.DefaultConfig()
cfg.Middleware.Middlewares = []httpc.MiddlewareFunc{auditMiddleware}

带配置的审计

go
auditCfg := &httpc.AuditMiddlewareConfig{
    Format:         "json",
    IncludeHeaders: true,
    MaskHeaders:    []string{"Authorization", "Cookie"},
    SanitizeError:  true,
}
auditMiddleware := httpc.AuditMiddlewareWithConfig(func(event httpc.AuditEvent) {
    data, _ := json.Marshal(event)
    log.Println(string(data))
}, auditCfg)

下一步