ppt_tep JOIN: slug-fallback ILIKE перевёрнут (doc_ref ILIKE '%doc_full_name%') — никогда не матчит + LIKE-метасимволы не экранированы #1619

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

Severity: low · Категория: logic/sql-correctness · Файл: backend/app/services/site_finder/ppt_tep_lookup.py:50-53

Файл: backend/app/services/site_finder/ppt_tep_lookup.py:50-53 (условие на строке 52). Вторая ветка JOIN: t.doc_ref ILIKE '%' || pp.doc_full_name || '%'. doc_ref — короткий slug парсера по PDF (ekb_ppt_tep_sync.py:39, пример 'ppt2018_22823'); doc_full_name — длинное описание из WFS. Паттерн истинен только когда короткий slug СОДЕРЖИТ длинное описание → невозможно, т.е. документированный (docstring :13-14) slug-fallback фактически мёртв. ИМПАКТ: 1) ТЭП-контент (zone_balance/tep/phasing) не подтягивается для проектов, где source_key != doc_ref, хотя docstring обещает обратное — тихая недопоставка в ИРД-блоке; 2) при '%'/'_' в doc_full_name (не экранированы) — возможна ложная привязка чужого ТЭП. Ограничено: основная ветка (строка 51) doc_ref = CAST(pp.source_key AS text) работает, пустой результат graceful. ФИКС: развернуть паттерн под реальную семантику — pp.doc_full_name ILIKE '%' || t.doc_ref || '%' (искать slug внутри описания) и экранировать LIKE-метасимволы в подставляемом значении (или ESCAPE-клаузу). Добавить тест на slug-матч.

Почему баг: 1) Заявленный slug-fallback мёртв → ТЭП-контент (zone_balance/tep/phasing) не подтягивается для проектов, где source_key != doc_ref, хотя docstring обещает обратное (тихая недопоставка в ИРД-блоке). 2) При LIKE-метасимволах в doc_full_name — ложная привязка чужого ТЭП к проекту. Импакт ограничен: основная ветка (doc_ref = source_key) работает, пустой результат graceful → low.

Как чинить: Инвертировать направление если slug ссылается на документ: pp.doc_full_name ILIKE '%' || t.doc_ref || '%' (либо матч по нормализованному ключу). Экранировать LIKE-метасимволы в подставляемом значении (+ ESCAPE) либо строгое равенство нормализованных идентификаторов.


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

**Severity:** low · **Категория:** logic/sql-correctness · **Файл:** `backend/app/services/site_finder/ppt_tep_lookup.py:50-53` Файл: backend/app/services/site_finder/ppt_tep_lookup.py:50-53 (условие на строке 52). Вторая ветка JOIN: t.doc_ref ILIKE '%' || pp.doc_full_name || '%'. doc_ref — короткий slug парсера по PDF (ekb_ppt_tep_sync.py:39, пример 'ppt2018_22823'); doc_full_name — длинное описание из WFS. Паттерн истинен только когда короткий slug СОДЕРЖИТ длинное описание → невозможно, т.е. документированный (docstring :13-14) slug-fallback фактически мёртв. ИМПАКТ: 1) ТЭП-контент (zone_balance/tep/phasing) не подтягивается для проектов, где source_key != doc_ref, хотя docstring обещает обратное — тихая недопоставка в ИРД-блоке; 2) при '%'/'_' в doc_full_name (не экранированы) — возможна ложная привязка чужого ТЭП. Ограничено: основная ветка (строка 51) doc_ref = CAST(pp.source_key AS text) работает, пустой результат graceful. ФИКС: развернуть паттерн под реальную семантику — pp.doc_full_name ILIKE '%' || t.doc_ref || '%' (искать slug внутри описания) и экранировать LIKE-метасимволы в подставляемом значении (или ESCAPE-клаузу). Добавить тест на slug-матч. **Почему баг:** 1) Заявленный slug-fallback мёртв → ТЭП-контент (zone_balance/tep/phasing) не подтягивается для проектов, где source_key != doc_ref, хотя docstring обещает обратное (тихая недопоставка в ИРД-блоке). 2) При LIKE-метасимволах в doc_full_name — ложная привязка чужого ТЭП к проекту. Импакт ограничен: основная ветка (doc_ref = source_key) работает, пустой результат graceful → low. **Как чинить:** Инвертировать направление если slug ссылается на документ: pp.doc_full_name ILIKE '%' || t.doc_ref || '%' (либо матч по нормализованному ключу). Экранировать LIKE-метасимволы в подставляемом значении (+ ESCAPE) либо строгое равенство нормализованных идентификаторов. --- <sub>deep-audit backend v2 (после PR #1543) · verify+harden, confidence 0.85 · unit B40</sub>
bot-backend added the
week ревью 1
label 2026-06-16 17:21:03 +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#1619
No description provided.