Если вы используете Telegram Bot API через webhook, главная ошибка — принимать любой входящий POST-запрос как настоящий. В итоге бота можно заспамить, сломать логику или подменить события. Разберёмся, как проверить подлинность webhook-запросов Telegram и защититься от мусора.
Зачем вообще нужна проверка webhook
Webhook — это публичный URL, на который Telegram отправляет обновления: сообщения, callback_query, команды и другие события. Если не настроить проверку, злоумышленник может:
- отправлять фальшивые апдейты на ваш endpoint
- перегружать сервер спам-запросами
- имитировать действия пользователей
- запускать бизнес-логику без Telegram
Как Telegram рекомендует проверять запросы
Самый надёжный способ — использовать секретный токен при установке webhook.
При вызове setWebhook можно передать параметр secret_token. После этого Telegram будет добавлять в каждый запрос HTTP-заголовок:
X-Telegram-Bot-Api-Secret-Token
На сервере нужно просто сравнить значение этого заголовка с вашим секретом. Если не совпало — сразу возвращать 403 Forbidden.
Почему это важно
Проверка по IP полезна, но недостаточна. IP-адреса могут меняться, а ошибки в сетевой конфигурации случаются часто. Секретный токен — простой и официальный способ верификации webhook от Telegram.
Как правильно настроить защиту
- Сгенерируйте длинный случайный secret_token
- Передайте его в setWebhook
- На сервере проверяйте заголовок X-Telegram-Bot-Api-Secret-Token
- При несовпадении не обрабатывайте тело запроса
- Логируйте отклонённые обращения без чувствительных данных
- Ограничьте методы: принимайте только POST
- Подключите HTTPS — Telegram работает с webhook только через защищённое соединение
Дополнительная защита от спама ⚙️
Даже с токеном стоит добавить базовую гигиену:
- rate limiting на уровне сервера или reverse proxy
- ограничение размера тела запроса
- таймауты обработки
- очередь задач, если бот получает много событий
- идемпотентность, чтобы повторный апдейт не ломал сценарий
Нужно ли проверять подпись тела запроса?
Многие ищут “подпись webhook Telegram” или “Telegram webhook signature”. В классическом виде криптографической подписи тела, как у некоторых платёжных систем, Telegram для Bot API webhook не использует. Основной механизм проверки подлинности — именно secret_token в заголовке. Поэтому запрос “как проверить подпись webhook Telegram” по сути означает “как проверить, что запрос действительно пришёл от Telegram”.
Частая ошибка разработчиков ❌
Некоторые прячут endpoint вида /bot и считают это защитой. Это слабая мера: URL может утечь в логах, конфигурациях или сторонних сервисах. Секретный заголовок безопаснее и удобнее.
Итог
Если хотите защитить Telegram webhook от подмены и спама, минимальный стандарт такой:
- HTTPS
- secret_token через setWebhook
- проверка X-Telegram-Bot-Api-Secret-Token
- отказ всем неподтверждённым запросам
- базовые антиспам-лимиты 🛡️
Если хотите собирать надёжную инфраструктуру для бота, посмотрите нашу подборку Телеграм-каналов 📌