fix(ptica): скраб ПДн перестаёт утекать то, что защищает + проводка проверяется поведением (#2753) #2787
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2787
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/2753-pii-scrub"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что было
Страховка
try/exceptвокруг скраба ПДн логировала сбой черезlogger.exception— то есть при падении скрабера в мониторинг уходило НОВОЕ событие, в локальных переменных которого лежал неочищенныйeventцеликом. Проводка обработчиков при этом проверялась поиском подстроки по тексту исходника.Что сделано
1.
include_local_variables=False— главноеДефолт SDK —
True, Птица его нигде не переопределяла (grepпо живому контейнеруgendesign-backend-1: пусто). При ЛЮБОМ исключении кадр стека нёс значения аргументов — телефон заявки, адрес, токен — под ПРОИЗВОЛЬНЫМИ именами. Скраб сверяет ИМЕНА ключей, поэтому такое не ловит по построению: это не дополнительная мера, а условие его полноты. У МЕРЫ флаг стоит с #2737.Проверено пробой: до фикса значение локальной переменной
applicant_noteдоезжало до транспорта в"vars"кадра.2. Сбой скраба не становится событием
ignore_logger(__name__)+ логирование без трассировки и безstr(exc)(только имя класса исключения — данных не несёт). Рекурсия из тела задачи проверена ИСПОЛНЕНИЕМ, а не рассуждением: на коде до фикса процесс не завершается, 1000+ вложенных трассировок за минуту. Диагностика осталась в stdout контейнера — текст трассировки значений переменных не печатает.3. Проводка — по поведению, а не по подстроке
backend/tests/_sentry_wiring_probe.pyподнимает настоящийsentry_sdk.init()в подпроцессе, подменяет транспорт и смотрит, что до него доехало: тело запроса (error), тело запроса (transaction), кадр стека, повторный вход при сбое скраба. Наружу не уходит ничего: DSN на несуществующий хост,capture_envelopeподменён до первого события, маркеры генерируются случайно (в кадре стека едут ещё и строки исходника).4. Подписи НДС — отдельным коммитом
Не связано с приватностью, поэтому вторым коммитом. Три места, не два (третье нашлось при проверке): сноска отрицала коммерцию, строка каскада подписана «НДС (паркинг)», и та же сноска добивала «Коммерческие и офисные площади не учитываются» — при том что сам компонент рисует строку «Выручка — нежилое (1-й этаж)» из
revenue_office_rub.Доказательство, что тест краснеет
Отдельное дерево на
origin/main+ новые тесты,app/не тронут:Отдельно — разрыв проводки при сохранённом комментарии (удалены строки
before_send=scrub_event,, комментарий переформулирован так, что несёт те же имена аргументов):Test plan
pytest backend/целиком: 4614 passed, 48 skipped, 0 failedruff checkна изменённых файлахorigin/mainlocalhost.invalidgrep include_local_variablesв живом контейнереCloses #2753