Skip to content

Контрольный список для продакшена

Базовая конфигурация

  • [ ] Использовать HighSecurityConfig() или пользовательскую конфигурацию безопасности
  • [ ] Установить разумный MaxInputSize (в зависимости от бизнес-требований)
  • [ ] Установить ProcessingTimeout для предотвращения длительных блокировок
  • [ ] Настроить MaxDepth для ограничения глубины DOM
  • [ ] Включить EnableSanitization для очистки контента

Жизненный цикл Processor

  • [ ] Использовать defer p.Close() для корректного освобождения Processor
  • [ ] Не использовать Processor после закрытия
  • [ ] Рассмотреть использование Singleton Processor для повторного использования ресурсов
go
p, err := html.New(html.HighSecurityConfig())
if err != nil {
    log.Fatal(err)
}
defer p.Close()

Аудит и мониторинг

  • [ ] Включить систему аудита
  • [ ] Настроить соответствующую фильтрацию по уровням аудита
  • [ ] Использовать WriterAuditSink для постоянного хранения журнала аудита
  • [ ] Отслеживать счётчик ошибок в GetStatistics()
  • [ ] Обращать внимание на ошибки ErrInternalPanic и события аудита AuditEventPathTraversal
go
auditFile, _ := os.OpenFile("audit.jsonl", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
defer auditFile.Close()

cfg := html.HighSecurityConfig()
cfg.Audit.Sink = html.NewWriterAuditSink(auditFile)

Контекст и тайм-ауты

  • [ ] Использовать версии ExtractWithContext для всех операций извлечения
  • [ ] Установить разумный тайм-аут контекста
  • [ ] Использовать контекст с отменой для пакетных операций
go
ctx, cancel := context.WithTimeout(ctx, 30*time.Second)
defer cancel()
result, err := html.ExtractWithContext(ctx, data)

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

  • [ ] Разделять бизнес-ошибки и ошибки безопасности
  • [ ] Записывать все ErrInputTooLarge и ErrMaxDepthExceeded
  • [ ] Отслеживать частоту ErrInternalPanic
  • [ ] Для ErrFileNotFound проверять SafePath() вместо исходного сообщения об ошибке

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

  • [ ] Пакетные операции не более 10 000 элементов за раз
  • [ ] Разумно настроить WorkerPoolSize
  • [ ] Регулярно вызывать ClearCache() для освобождения кэша
  • [ ] Мониторить использование памяти и процент попаданий в кэш

Обработка файлов

  • [ ] Проверять источник пути к файлу (предотвращение управления путём пользователем)
  • [ ] Ограничивать каталог чтения файлов
  • [ ] Проверять размер файла перед обработкой