Skip to content

Обзор безопасности

HTTPC следует принципу "Secure by Default" (безопасность по умолчанию), все функции безопасности работают из коробки.

Обзор функций безопасности

ФункцияПо умолчаниюОписание
Минимальная версия TLSTLS 1.2Отклоняет TLS 1.0/1.1
Защита от SSRFВключенаБлокирует подключения к приватным IP
Валидация URLВключенаПроверка формата и протокола URL
Валидация заголовковВключенаПредотвращает CRLF-инъекции
Строгая проверка Content-LengthВключенаПредотвращает response smuggling
Проверка безопасности 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/8Loopback
10.0.0.0/8Класс A приватные
172.16.0.0/12Класс B приватные
192.168.0.0/16Класс C приватные
169.254.0.0/16Link-local
100.64.0.0/10CGNAT (включая метаданные Alibaba Cloud 100.100.100.200)
240.0.0.0/4Класс E зарезервированные
::1/128IPv6 loopback
fc00::/7IPv6 уникальные локальные
fe80::/10IPv6 link-local

Выше приведены основные диапазоны. Полный список (включая 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)

Что дальше