Контрольный список для продакшена
Базовая конфигурация
- [ ] Использовать
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()для освобождения кэша - [ ] Мониторить использование памяти и процент попаданий в кэш
Обработка файлов
- [ ] Проверять источник пути к файлу (предотвращение управления путём пользователем)
- [ ] Ограничивать каталог чтения файлов
- [ ] Проверять размер файла перед обработкой