X-API-Key compared as bytes (401 instead of 500 on non-ASCII), strict parsing of the diff "since" parameter (400 instead of 500), FQDN resolution keeps only global addresses (allow_non_global_ips to opt out). Adds the code review report and the plan/summary for this change. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
3.4 KiB
3.4 KiB
Итоги: безопасность ввода и данных (п. 2-4 ревью)
План: docs/plan-input-hardening.md. Источник: docs/review-2026-09-21.md.
Сделано
X-API-Key(находка 2): токены сравниваются по байтам (api_server.py), нелатинский ключ даёт401вместо 500. Поведение с верным ключом и без токена в окружении (503) прежнее.since(находка 3): курсор - только ASCII-цифры длиной до 30 символов (MAX_CURSOR_DIGITS); разбор времени защищён отOverflowError. Юникод-цифры, слишком длинные числа и крайние даты с поясом дают400; корректный, но выходящий за журнал курсор (до 30 цифр) по-прежнему410.- DNS-адреса (находка 4):
FQDNCollector.resolve_fqdnоставляет только глобальные адреса (is_global), зона IPv6 (%eth0) отбрасывается, отфильтрованное пишется в лог (WARNING). Если глобальных адресов нет, результат пуст: сбор ведёт себя как при ошибке DNS (TTL не применяется, данные не удаляются). Ключallow_non_global_ipsвconfig.json(по умолчаниюfalse) отключает фильтр для внутренних имён. - README: ограничения
since, ключallow_non_global_ips, логика сборщика. В отчёте ревью находки 2-4 отмечены исправленными. - Тесты: 2 новых (нелатинский ключ и некорректный
since; фильтр адресов с разрешением и без). Всего 22, в контейнере 22 passed.
Проверка
Повторены запросы из ревью в контейнерном окружении: X-API-Key с é -> 401; since = ², число из 5000 цифр, 0001-01-01T00:00:00+05:00, 9999-12-31T23:59:59-05:00 -> 400 (раньше 500); since = 30 девяток -> 410; корректное время с поясом -> 200. Реальный getaddrinfo для localhost возвращает пустой список, в логе ignoring non-global addresses: 127.0.0.1, ::1.
Замечания
- Фильтр меняет поведение для существующих установок только при наличии в данных неглобальных адресов; уже собранные такие адреса не удаляются сразу, а истекают по
ttl_days(для немедленной очистки:DELETE /fqdns/<имя>?purge=trueи добавить имя заново). is_globalотсекает и адреса общего назначения, например100.64.0.0/10(CGNAT) и документационные диапазоны; для внутренних имён используйтеallow_non_global_ips.- Не вошло: находка 1 (пустая выдача после порчи без копий) ждёт решения по поведению; находки 5-10 - отдельные доработки.