DDU-индикатор: нет валидации формата/порядка periodFrom/periodTo — мусорный или инвертированный period тихо отдаёт пустой/усечённый ряд #1566

Closed
opened 2026-06-16 17:05:36 +00:00 by bot-backend · 0 comments
Collaborator

Severity: low · Категория: validation/cross-field · Файл: backend/app/services/analytics/ddu_price_indicator.py:152-158

Файл: backend/app/services/analytics/ddu_price_indicator.py:152-158. period_from/period_to принимаются как произвольные строки max_length=10 без проверки формата (schemas/market.py:28-29) и подставляются как AND period_value >= :period_from / AND period_value <= :period_to. period_value в mv_ddu_price_indicator — текст вида '2026-Q1' (152_mv_ddu_price_indicator.sql:140-141), сравнение строковое (лексикографическое). Нет проверки ни формата ('YYYY-QN'), ни инварианта period_from <= period_to. Импакт: 1) мусорный period_from ('foo', '2026') лексикографически сравнивается с '2025-Q2' и тихо отфильтровывает все/часть строк — клиент получает пустой/усечённый ряд без note и без 422; 2) инвертированный диапазон (from='2026-Q1', to='2025-Q2') даёт пустую таблицу без сигнала, что границы перепутаны. Лексикографика совпадает с хронологией ТОЛЬКО благодаря строгому формату YYYY-QN, который как раз не валидируется. Фикс: добавить в схему/сервис regex-валидацию '^\d{4}-Q[1-4]$' для period_from/period_to и проверку period_from<=period_to (вернуть 422 либо note при нарушении). Severity low: read-only аналитика, тихий пустой/неполный ответ на некорректном вводе, не падение и не порча данных.

Почему баг: 1) Мусорный period_from (например 'foo' или '2026') сравнивается лексикографически с '2025-Q2' и тихо отфильтровывает все/часть строк — клиент получает пустой или усечённый ряд без объяснения (нет note, нет 422). 2) Инвертированный диапазон (period_from > period_to, например from='2026-Q1', to='2025-Q2') даёт пустую таблицу без сигнала о том, что границы перепутаны. Это не падение, но 'тихий неверный/пустой ответ' на некорректном вводе по основному аналитическому эндпоинту. Лексикографика тут совпадает с хронологией ТОЛЬКО потому что формат строго YYYY-QN — но формат как раз и не валидируется.

Как чинить: Валидировать period_from/period_to регуляркой ^\d{4}-Q[1-4]$ (Pydantic pattern) и добавить cross-field валидатор period_from <= period_to (model_validator), либо при невалидном/инвертированном диапазоне добавлять явный note вместо тихого пустого ответа.


deep-audit backend v2 (после PR #1543) · verify+harden, confidence 0.72 · unit B05

**Severity:** low · **Категория:** validation/cross-field · **Файл:** `backend/app/services/analytics/ddu_price_indicator.py:152-158` Файл: backend/app/services/analytics/ddu_price_indicator.py:152-158. period_from/period_to принимаются как произвольные строки max_length=10 без проверки формата (schemas/market.py:28-29) и подставляются как `AND period_value >= :period_from` / `AND period_value <= :period_to`. period_value в mv_ddu_price_indicator — текст вида '2026-Q1' (152_mv_ddu_price_indicator.sql:140-141), сравнение строковое (лексикографическое). Нет проверки ни формата ('YYYY-QN'), ни инварианта period_from <= period_to. Импакт: 1) мусорный period_from ('foo', '2026') лексикографически сравнивается с '2025-Q2' и тихо отфильтровывает все/часть строк — клиент получает пустой/усечённый ряд без note и без 422; 2) инвертированный диапазон (from='2026-Q1', to='2025-Q2') даёт пустую таблицу без сигнала, что границы перепутаны. Лексикографика совпадает с хронологией ТОЛЬКО благодаря строгому формату YYYY-QN, который как раз не валидируется. Фикс: добавить в схему/сервис regex-валидацию '^\d{4}-Q[1-4]$' для period_from/period_to и проверку period_from<=period_to (вернуть 422 либо note при нарушении). Severity low: read-only аналитика, тихий пустой/неполный ответ на некорректном вводе, не падение и не порча данных. **Почему баг:** 1) Мусорный period_from (например 'foo' или '2026') сравнивается лексикографически с '2025-Q2' и тихо отфильтровывает все/часть строк — клиент получает пустой или усечённый ряд без объяснения (нет note, нет 422). 2) Инвертированный диапазон (period_from > period_to, например from='2026-Q1', to='2025-Q2') даёт пустую таблицу без сигнала о том, что границы перепутаны. Это не падение, но 'тихий неверный/пустой ответ' на некорректном вводе по основному аналитическому эндпоинту. Лексикографика тут совпадает с хронологией ТОЛЬКО потому что формат строго YYYY-QN — но формат как раз и не валидируется. **Как чинить:** Валидировать period_from/period_to регуляркой ^\d{4}-Q[1-4]$ (Pydantic pattern) и добавить cross-field валидатор period_from <= period_to (model_validator), либо при невалидном/инвертированном диапазоне добавлять явный note вместо тихого пустого ответа. --- <sub>deep-audit backend v2 (после PR #1543) · verify+harden, confidence 0.72 · unit B05</sub>
bot-backend added the
week ревью 1
label 2026-06-16 17:05:36 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1566
No description provided.