#3194: ключ шифрования кук и сами куки больше не уезжают в GlitchTip #3275
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#3275
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/3194-hide-sql-parameters"
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?
Закрывает #3194.
Дефект
Сервисы сессий передают ключ шифрования bind-параметром:
Любое исключение из
db.executeSQLAlchemy оборачивает вStatementError, а текст этого исключения содержит все bind-параметры — и уезжает в GlitchTip вместе с ключом и живыми авторизационными куками.Поверхность оказалась шире, чем в issue
Аудит нашёл на обеих осях больше, чем было названо:
app/core/db.py:8)packages/scraper-kit/providers/cian/session.py:218Правка сделана на уровне движка, а не по сайтам вызова:
hide_parameters=Trueна всех пяти. Это кроет и четвёртую копию, которую issue не знает, и всё будущее — латать по одному месту значило бы повторить ровно ту ошибку, за которую сам репозиторий уже расплатился удалённым allowlist'омscraperв #2679.Отдельно:
scheduler_main.pyбыл единственным из трёхsentry_sdk.initбезinclude_local_variables=False(соседи ставят:main.py:123,tgbot_main.py:100). Это процесс скрейпера, в локальных переменных кадров лежат прокси-креды видаuser:pass. Добавлено.Чего правка НЕ закрывает
Написано в комментариях у самих правок, чтобы не читалось как «теперь всё безопасно»:
DETAIL: Key (col)=(value)) — он собирается ДО гейтаhide_parameters;Аудит проверил оба: секретов на этих путях сейчас нет (данные публичные, скрейпленные), но механизм остаётся открытым.
Утекло ли уже
Проверено фактом, а не рассуждением: полный скан боевого GlitchTip — 31 417 событий по всем партициям и 7 712 issues, подстроки
[parameters:,pgp_sym_encrypt,cookies_json,COOKIE_ENCRYPTION, сам ключ и его 16-символьный префикс. Пересечений ноль.Честная граница вывода: окно только с 31.05.2026. Скептик отдельно отметил, что 91 день одинаково объясняется и ретенцией, и тем, что таблицу завели в эту дату — маркер не различает. Плюс искали текущее значение ключа, а он ротируемый. Про период до 31.05 сказать нечего — если владелец считает риск неприемлемым, ротация остаётся его решением.
Проверки
Тест
test_3194_hide_sql_parameters.py, 3 кейса. Отказ провоцируется на уровне запроса (живой sqlite,SELECT :key FROM no_such_table_3194), и ассерт на имя таблицы доказывает, что дело дошло до bind-параметров, а не упало на CONNECT — я сегодня уже обжёгся ровно на такой тавтологии, когда обе ветки моей ручной пробы напечатали «секрета нет» просто потому, что соединение падало раньше.Фальсификация дважды, автором и ревьюером независимо: снятие флага даёт красное по значению (
assert False is True), не ImportError.pytest9 passed ·ruff checkчисто по всем 7 файлам · хуки зелёные,--no-verifyне использовался.Известный пробел (от ревьюера): проводочный тест стоит только на движке МЕРЫ — снятие флага в
backend/app/core/ничего не покрасит. Механизм общий, но симметричного сторожа у ПТИЦЫ нет.