Skip to content

fix: улучшена безопасность webhook и защита токена#95

Closed
bish-x wants to merge 2 commits intolove-apples:mainfrom
bish-x:fix/security-hardening
Closed

fix: улучшена безопасность webhook и защита токена#95
bish-x wants to merge 2 commits intolove-apples:mainfrom
bish-x:fix/security-hardening

Conversation

@bish-x
Copy link
Copy Markdown
Contributor

@bish-x bish-x commented Apr 8, 2026

Описание

1. Предупреждение при запуске webhook без secret

Файл: webhook/base.py

При secret=None (по умолчанию) webhook-эндпоинт принимает запросы без какой-либо аутентификации. Злоумышленник, знающий URL, может отправлять поддельные обновления. Добавлен logger_dp.warning при запуске без secret.

2. Исключения больше не утекают memory_context через repr()

Файл: exceptions/dispatcher.py

HandlerException и MiddlewareException — dataclass с автогенерированным __repr__, который выводил все поля, включая memory_context с FSM-данными пользователей. В dispatcher.py:986 использовался %r → полный контекст попадал в логи. Добавлен __repr__ = __str__, который выводит только ключи.

3. Предупреждение при подписке webhook на HTTP (не HTTPS)

Файл: methods/subscribe_webhook.py

URL вебхука не проверялся на использование HTTPS. Разработчик мог случайно подписать бота на HTTP-эндпоинт — обновления (включая сообщения пользователей) передавались бы по незашифрованному каналу. Добавлен warnings.warn.

4. Bot.__repr__ с маскировкой токена

Файл: bot.py

Добавлен __repr__, возвращающий Bot(token='***'), для защиты от случайной утечки токена в логах и трейсбеках.

Тестирование

  • Все существующие тесты проходят
  • ruff check / ruff format — без замечаний

- webhook/base.py: предупреждение при запуске без secret
- exceptions/dispatcher.py: __repr__ = __str__ для HandlerException и MiddlewareException (защита memory_context от утечки через %r)
- methods/subscribe_webhook.py: предупреждение при подписке на HTTP URL
- bot.py: __repr__ возвращает Bot(token='***') для защиты токена в логах

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 8, 2026

Codecov Report

❌ Patch coverage is 66.66667% with 3 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
maxapi/methods/subscribe_webhook.py 33.33% 2 Missing ⚠️
maxapi/bot.py 50.00% 1 Missing ⚠️

📢 Thoughts on this report? Let us know!

…ning

Добавлены тесты для 3 непокрытых участков кода (Codecov patch coverage):
- Bot.__repr__ маскирует токен (bot.py:204)
- warnings.warn при http:// URL в SubscribeWebhook (subscribe_webhook.py:49-52)
- logger warning при secret=None в BaseMaxWebhook (webhook/base.py:51)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@love-apples
Copy link
Copy Markdown
Owner

@copilot resolve the merge conflicts in this pull request

@bish-x
Copy link
Copy Markdown
Contributor Author

bish-x commented Apr 14, 2026

Закрываю как дубликат — все изменения этого PR уже в main через #92 (f3d1366, 2026-04-12), причём с улучшениями после ревью Copilot:

  • bot.pyBot.__repr__ → "Bot(token='***')" идентично (bot.py:208-209).
  • exceptions/dispatcher.py__repr__ = __str__ для HandlerException и MiddlewareException идентично (exceptions/dispatcher.py:28, 52).
  • methods/subscribe_webhook.py — HTTP-warning сужен: url.startswith("http://") вместо моего not url.startswith("https://"), чтобы не ворнить ложно на wss://, //path и подобное.
  • webhook/base.py — secret-warning расширен: if not self.secret вместо моего if self.secret is None, чтобы ловить и пустую строку.

Тесты HTTP-предупреждения и Bot.__repr__ уже покрыты в tests/test_coverage_gaps.py (TestSubscribeWebhookHttpWarning) и tests/test_bot.py:97-102. Единственная реальная новизна тут — logger-warning тест для secret в BaseMaxWebhook; занесу его отдельным маленьким PR с кейсами None, "" и валидной строкой.

Ветку оставляю на случай если из неё пригодятся тесты. Спасибо за апрувы.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants