Skip to content

Защита безопасности

HTML-библиотека имеет встроенную многоуровневую защиту. Все настройки централизованы в полях безопасности Config. Эта страница описывает API, связанный с безопасностью; концептуальный обзор см. в Обзор безопасности.

Поля конфигурации безопасности

ПолеТипПо умолчаниюНазначение безопасности
EnableSanitizationbooltrueСанитизация контента: удаление опасных тегов, атрибутов событий и вредоносных протоколов
MaxInputSizeint52428800 (50МБ)Лимит размера ввода, предотвращает исчерпание памяти
MaxDepthint500Лимит глубины вложенности DOM, предотвращает рекурсивные бомбы
ProcessingTimeouttime.Duration30sТайм-аут обработки документа, предотвращает бесконечную обработку
AllowedBaseDirstring""Песочница файловых операций, предотвращает обход пути
AuditAuditConfigDefaultAuditConfig()Настройка аудита безопасности (см. Система аудита)

Риск отключения санитизации

EnableSanitization включён по умолчанию. Отключайте только для полностью доверенного ввода. Отключение приводит к парсингу HTML как есть, что может привести к XSS-рискам.

Санитизация контента

При включении (по умолчанию) автоматически применяется следующая очистка:

Уровень защитыПоведение
Опасные тегиУдаляет <script>, <style>, <iframe>, <object>, <embed> и т.д.
Атрибуты событийУдаляет все атрибуты on* (onclick, onerror и т.д.)
Опасные протоколыБлокирует javascript:, vbscript:
Data URLРазрешает только data:image/*, data:font/*, data:application/pdf

Заблокированный контент записывается через систему аудита (требуется включение аудита).

Безопасность путей

Песочница AllowedBaseDir

Ограничивает файловые операции (ExtractFromFile и т.д.) указанной директорией и её подкаталогами:

go
cfg := html.DefaultConfig()
cfg.AllowedBaseDir = "/var/www/html"

p, err := html.New(cfg)
if err != nil {
    log.Fatal(err)
}
defer p.Close()

// ✅ Разрешено: файл внутри директории
result, err := p.ExtractFromFile("/var/www/html/page.html")

// ❌ Отклонено: файл вне директории
_, err = p.ExtractFromFile("/etc/passwd")

После настройки пути файлов должны находиться внутри AllowedBaseDir для чтения. Кроссплатформенная поддержка:

  • Unix: Разрешает символические ссылки, предотвращает побег через ссылки
  • Windows: Разрешает junction и символические ссылки

Пустое значение (по умолчанию) означает отсутствие ограничений — подходит для доверенных сценариев ввода.

Обнаружение обхода пути

Автоматически обнаруживает и блокирует попытки обхода пути (например, ../../../etc/passwd), возвращая ошибку *FileError:

go
_, err := html.ExtractFromFile("../../../etc/passwd")
// err содержит информацию "path traversal detected"

FileError.SafePath

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

go
type FileError struct {
    Op      string
    Path    string
    FileErr error
}

func (e *FileError) Error() string        // Вывод усечённого пути (только имя файла)
func (e *FileError) SafePath() string     // Возвращает только имя файла
func (e *FileError) MarshalJSON() ([]byte, error) // Автоматическое маскирование при JSON-сериализации
go
_, err := html.ExtractFromFile("/var/www/secret/config.html")
if err != nil {
    var fileErr *html.FileError
    if errors.As(err, &fileErr) {
        fmt.Println(fileErr.SafePath()) // Вывод: config.html (без пути)
    }
}

TIP

FileError.Error() и SafePath() возвращают усечённый безопасный путь (только имя файла), предотвращая утечку пути. Для внутренней отладки обратитесь к полю Path напрямую.

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

HighSecurityConfig

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

go
func HighSecurityConfig() Config

Переопределение полей безопасности по сравнению с DefaultConfig():

ПолеПо умолчаниюВысокая безопасность
MaxInputSize52428800 (50МБ)10485760 (10МБ)
MaxDepth500100
ProcessingTimeout30s10s
WorkerPoolSize42
AuditDefaultAuditConfig()HighSecurityAuditConfig()
go
cfg := html.HighSecurityConfig()
p, err := html.New(cfg)
if err != nil {
    log.Fatal(err)
}
defer p.Close()

Ошибки, связанные с безопасностью

ОшибкаУсловие срабатывания
ErrInputTooLargeВвод превышает MaxInputSize
ErrMaxDepthExceededГлубина DOM превышает MaxDepth
ErrProcessingTimeoutОбработка превышает ProcessingTimeout
ErrInvalidFilePathПроверка пути файла не пройдена (включая обход пути)
ErrInternalPanicВнутренняя паника восстановлена

INFO

Полные определения типов ошибок (InputError, ConfigError, FileError) и использование errors.Is/errors.As см. в Константы и ошибки.

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

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

go
result, err := html.Extract(maliciousData)
if err != nil {
    if errors.Is(err, html.ErrInternalPanic) {
        // Ввод мог вызвать внутренний баг
        log.Printf("panic recovered: %v", err)
    }
}

Связанная документация