Skip to content

Контрольный список для production

Обязательные проверки

Конфигурация TLS

  • [ ] InsecureSkipVerify установлен в false (значение по умолчанию)
  • [ ] MinTLSVersion не ниже tls.VersionTLS12
  • [ ] Не используется TestingConfig()

Защита от SSRF

  • [ ] AllowPrivateIPs равен false (значение по умолчанию)
  • [ ] При необходимости доступа к внутренним сервисам используйте SSRFExemptCIDRs для точного указания
  • [ ] При обработке URL от пользователей используйте SecureConfig()

Настройка таймаутов

  • [ ] Все значения таймаутов установлены и разумны
  • [ ] TimeoutConfig.Request не равен 0 (предотвращает бесконечное ожидание)
  • [ ] Рассмотрите использование WithContext для установки таймаута каждого запроса

Ограничения ответов

  • [ ] MaxResponseBodySize установлен в разумный предел
  • [ ] MaxDecompressedBodySize установлен в разумный предел
  • [ ] При обработке больших ответов используйте потоковую загрузку

Конфигурация повторных попыток

  • [ ] MaxRetries не превышает 5
  • [ ] Для неидемпотентных запросов (POST/PUT/PATCH) используйте повторные попытки с осторожностью
  • [ ] Включите EnableJitter для предотвращения эффекта стада

Управление ресурсами

  • [ ] После использования клиент вызывает Close()
  • [ ] Используйте defer для гарантии освобождения ресурсов

Рекомендуемые проверки

Промежуточное ПО

  • [ ] Используйте RecoveryMiddleware() для предотвращения падения при panic
  • [ ] Используйте LoggingMiddleware() для логирования запросов
  • [ ] Используйте MetricsMiddleware() для сбора метрик
  • [ ] В сценариях с повышенной безопасностью используйте AuditMiddleware()

Заголовки запросов

  • [ ] Установите осмысленный User-Agent
  • [ ] Не храните конфиденциальную информацию в заголовках по умолчанию
  • [ ] Используйте WithBearerToken вместо ручной установки Authorization
  • [ ] В сценариях с повышенной безопасностью включите проверку CookieSecurity
  • [ ] Используйте StrictCookieSecurityConfig() для принудительного использования безопасных атрибутов

Перенаправления

  • [ ] В сценариях с пользовательским вводом URL отключите перенаправления
  • [ ] Используйте RedirectWhitelist для ограничения целевых доменов перенаправлений

Примеры кода

Создание production-клиента

go
func createProductionClient() (httpc.Client, error) {
    cfg := httpc.DefaultConfig()

    // Таймауты
    cfg.Timeouts.Request = 30 * time.Second
    cfg.Timeouts.Dial = 10 * time.Second
    cfg.Timeouts.TLSHandshake = 10 * time.Second
    cfg.Timeouts.ResponseHeader = 30 * time.Second // транспортный жёсткий предел: применяется ко всем запросам клиента, не переопределяется per-request через WithTimeout; для AI API/долгих ответов ставить 0 и полагаться на Request timeout

    // Пул соединений
    cfg.Connection.MaxIdleConns = 50
    cfg.Connection.MaxConnsPerHost = 10

    // Безопасность
    cfg.Security.AllowPrivateIPs = false
    cfg.Security.MaxResponseBodySize = 10 * 1024 * 1024

    // Повторные попытки
    cfg.Retry.MaxRetries = 3
    cfg.Retry.Delay = 1 * time.Second
    cfg.Retry.EnableJitter = true

    // Промежуточное ПО
    cfg.Middleware.UserAgent = "my-service/1.0"
    cfg.Middleware.Middlewares = []httpc.MiddlewareFunc{
        httpc.RecoveryMiddleware(),
        httpc.LoggingMiddleware(log.Printf),
        httpc.RequestIDMiddleware("X-Request-ID", nil),
    }

    return httpc.New(cfg)
}

Безопасный клиент

go
func createSecureClient() (httpc.Client, error) {
    cfg := httpc.SecureConfig()
    cfg.Security.CookieSecurity = httpc.StrictCookieSecurityConfig()
    cfg.Security.RedirectWhitelist = []string{"api.example.com"}
    return httpc.New(cfg)
}

Команды проверки

bash
# Проверка неправильного использования TestingConfig
grep -r "TestingConfig" --include="*.go" | grep -v "_test.go"

# Проверка InsecureSkipVerify
grep -r "InsecureSkipVerify.*true" --include="*.go" | grep -v "_test.go"

# Проверка AllowPrivateIPs
grep -r "AllowPrivateIPs.*true" --include="*.go" | grep -v "_test.go"

Что дальше