Files
ripe-cidr-collector/docs/summary-input-hardening.md
T
ayurishchevandClaude Sonnet 5 46d56654d8 Harden input handling and filter non-global DNS addresses
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>
2026-09-21 09:42:51 +03:00

3.4 KiB
Raw Blame History

Итоги: безопасность ввода и данных (п. 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 - отдельные доработки.