Skip to content

セキュリティ概要

HTTPC はデフォルトで安全(Secure by Default)に設計されており、すべてのセキュリティ機能がすぐに使用できます。

セキュリティ機能一覧

機能デフォルト説明
TLS 最低バージョンTLS 1.2TLS 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(Server-Side Request Forgery)は攻撃者がサーバーを利用して内部ネットワークにリクエストを送信させる攻撃手法です。

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/8クラス A プライベート
172.16.0.0/12クラス B プライベート
192.168.0.0/16クラス C プライベート
169.254.0.0/16リンクローカル
100.64.0.0/10CGNAT(Alibaba Cloud メタデータ 100.100.100.200 を含む)
240.0.0.0/4クラス E 予約
::1/128IPv6 ループバック
fc00::/7IPv6 ユニークローカル
fe80::/10IPv6 リンクローカル

上記は主要な範囲です。完全なリスト(0.0.0.0/8、TEST-NET、IPv6 ドキュメントプレフィックス 2001:db8::/32、NAT64 64:ff9b::/96 など)はソースコード isPrivateOrReservedIP を参照してください。

リクエストヘッダー検証

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)

次のステップ