К содержанию

Как защитить Telegram-бота от DDoS-атак и спама

Что на самом деле можно атаковать у Telegram-бота и как защитить вебхук, сервер и Mini App от наплыва запросов и спама.

Содержание 7 разделов

Защитить Telegram-бота от DDoS-атаки проще, чем сайт, и причина в устройстве Telegram. Пользователи не подключаются к серверу бота напрямую: их сообщения идут через Telegram, и он доставляет их боту в своём темпе. Под удар попадает то, что у бота открыто в интернет: адрес вебхука, бэкенд Mini App и сам сервер. Разбираем, как закрыть каждое направление.

Что можно атаковать у Telegram-бота

Начнём с самого бота. Его можно завалить сообщениями с множества аккаунтов разом, но сетевой трафик при этом берёт на себя Telegram, и до бота обновления доходят в темпе, который задаёт мессенджер. Опасность в другом: код бота может захлебнуться, если на каждое сообщение он ходит в нейросеть или собирает PDF.

С вебхуком иначе. Это публичный адрес, на который Telegram присылает обновления, и тот, кто его узнал, может слать запросы напрямую, в обход Telegram.

Бэкенд Mini App открыт в интернет, как любой сайт, потому что мини-приложение работает как веб-страница. Наконец, есть сам сервер: его IP-адрес и открытые порты, например база данных, которую забыли закрыть.

Бот на getUpdates без вебхука входящих запросов от Telegram не принимает: сервер сам забирает сообщения. Адрес такого сервера через бота не узнать.

Массовая атака через Telegram обходится дорого. Нужны сотни аккаунтов с номерами телефонов, а Telegram ограничивает частоту действий обычных аккаунтов и блокирует спамные. Гораздо проще флудить с одного-двух аккаунтов или скриптом, который жмёт кнопки. От этого спасают лимиты на пользователя.

Защита вебхука

  • Секретный заголовок. В setWebhook передают параметр secret_token (Bot API 6.1, 2022 год), и Telegram добавляет его в заголовок X-Telegram-Bot-Api-Secret-Token каждого запроса. Запросы без него сервер отбрасывает, не пуская в код бота.
  • Только IP Telegram. Вебхуки приходят из диапазонов, которые Telegram публикует в документации, сейчас это 149.154.160.0/20 и 91.108.4.0/22. Остальные адреса отсекает файрвол.
  • Быстрый ответ. Сервер сразу отвечает кодом 200 и кладёт обновление в очередь. Если обработчик думает долго, Telegram повторяет запросы, и нагрузка растёт сама собой.
  • Число соединений. Параметр max_connections (от 1 до 100, по умолчанию 40) ограничивает, сколько соединений Telegram откроет к серверу одновременно.

В MAX механизм похожий. При подписке на вебхук передают secret, и MAX присылает его в заголовке X-Max-Bot-Api-Secret. Почему токен бота нельзя вставлять в адрес вебхука, разбираем в статье о токене Telegram-бота.

Лимиты на пользователя и очередь задач

Флуд через Telegram гасится в коде бота. Каждое сообщение приходит с Telegram ID отправителя, поэтому бот может считать, сколько сообщений человек прислал за последнюю минуту, и после порога на время перестать ему отвечать. Упорных нарушителей блокируют по ID.

Тяжёлые операции, например запрос к нейросети или генерацию документа, бот ставит в очередь и сразу отвечает «Принял, готовлю». Отдельный процесс разбирает очередь в своём темпе. Наплыв запросов её удлиняет, но бота не кладёт. Каталог и частые ответы бот берёт из кеша, не дёргая каждый раз базу.

С платными запросами к нейросети нужна отдельная осторожность. Без дневного лимита на человека один настойчивый пользователь потратит месячный бюджет на API за вечер.

Защита Mini App и API

Запросы к Mini App идут напрямую из браузера пользователя, мимо Telegram, поэтому его защищают как обычный веб-сервис. Статику мини-приложения раздают через CDN или прокси с защитой от DDoS: во всей связке с ботом это единственное место, где CDN к месту. API проверяет initData: Telegram подписывает данные запуска ключом, который вычисляется из токена бота, и сервер отклоняет запросы с чужой подписью или старой датой запуска, не трогая базу. На API ставят лимиты по пользователю и по IP. Как мы делаем мини-приложения, рассказываем на странице Telegram Mini Apps.

Защита сервера

Крупную сетевую атаку на IP-адрес на самом сервере не отбить: канал забьётся раньше, чем сработает любая программа. Такой трафик фильтрует хостинг-провайдер, поэтому защиту от DDoS проверяют ещё при выборе площадки, подробнее в статье про сервер для Telegram-бота. Остальное настраивают на самом сервере. Открыты только нужные порты, база и Redis недоступны из интернета, SSH пускает только по ключу. Мониторинг сообщает, если в getWebhookInfo растёт число неразобранных обновлений.

Лимиты Telegram не защищают от атаки

Лимиты Telegram часто принимают за защиту. На деле они ограничивают исходящие сообщения самого бота: около одного сообщения в секунду в одном чате, 20 в минуту в группе и около 30 в секунду при рассылке. Платная рассылка за Telegram Stars поднимает потолок до 1 000 сообщений в секунду. Все ограничения собраны на странице лимиты Telegram.

Частые вопросы

Можно ли задудосить Telegram-бота?

Через Telegram сложно. Сообщения идут через его серверы и приходят боту ограниченным числом соединений, так что под удар попадают другие места: адрес вебхука, бэкенд Mini App и сам сервер. Их и защищают в первую очередь.

Как защитить Telegram-бота от спама?

Поставить лимит сообщений на пользователя, временно игнорировать нарушителей и блокировать их по Telegram ID. Тяжёлые операции вынести в очередь. Запросы к нейросети ограничить дневным лимитом на человека, чтобы один пользователь не израсходовал бюджет на API.

Что делать, если бота уже атакуют?

Понять, куда идёт нагрузка: в вебхук, в API Mini App или на сервер. Включить проверку secret_token и фильтр по IP Telegram, ужесточить лимиты и подключить защиту от DDoS у хостинг-провайдера. Если бот у нас на сопровождении, этим занимаемся мы.

ИИ-бриф

Нужен похожий бот? Опишите задачу

Бланк заявки Смета за 1 рабочий день
Чем занимается ваш бизнес?

Описание можно не писать: оставьте телефон или Telegram, и мы сами свяжемся и всё уточним.

Ответим в Telegram или по телефону