Skip to content

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

Библиотека HTML разработана с приоритетом безопасности и включает встроенные многоуровневые механизмы защиты.

Функции безопасности

Ограничение размера ввода

По умолчанию максимальный размер ввода — 50 МБ, предотвращает исчерпание памяти:

go
cfg := html.DefaultConfig()
cfg.MaxInputSize = 10 * 1024 * 1024 // Настройка на 10 МБ

Ограничение глубины DOM

По умолчанию максимальная глубина — 500, предотвращает атаки с рекурсивными бомбами:

go
cfg.MaxDepth = 200 // Усиление ограничения

Защита от обхода пути

Файловые операции автоматически обнаруживают и блокируют попытки обхода пути (например, ../../../etc/passwd) и записывают их через систему аудита.

Восстановление после паники

Все операции извлечения включают встроенный механизм восстановления panic, возвращающий ошибку ErrInternalPanic, что гарантирует, что сервис не выйдет из строя из-за злонамеренного ввода.

Тайм-аут обработки

Настраиваемый тайм-аут обработки предотвращает бесконечную обработку злонамеренного HTML:

go
cfg.ProcessingTimeout = 10 * time.Second

Очистка контента

Опциональная функция очистки контента, удаляющая потенциально опасные теги и атрибуты:

go
cfg.EnableSanitization = true

Система аудита

Подробная конфигурация безопасности аудита описана в Система аудита.

Система аудита может записывать следующие события безопасности:

СобытиеОписание
AuditEventBlockedTagЗаблокированные HTML-теги
AuditEventBlockedAttrЗаблокированные атрибуты
AuditEventBlockedURLЗаблокированные URL
AuditEventInputViolationНарушения размера ввода
AuditEventDepthViolationНарушения глубины DOM
AuditEventPathTraversalПопытки обхода пути
AuditEventTimeoutТайм-ауты обработки
AuditEventEncodingIssueАномалии кодировки

Конфигурация высокой безопасности

go
cfg := html.HighSecurityConfig()
// Автоматически включает: ужесточённые ограничения, более короткие тайм-ауты, полный аудит

Обработка ошибок

Все нарушения безопасности возвращают чёткие ошибки с поддержкой errors.Is / errors.As:

go
result, err := html.Extract(data)
if err != nil {
    switch {
    case errors.Is(err, html.ErrInputTooLarge):
        // Записать и отклонить
    case errors.Is(err, html.ErrMaxDepthExceeded):
        // Возможно злонамеренная конструкция
    case errors.Is(err, html.ErrInternalPanic):
        // Восстановление после паники, проверить ввод
    }
}