VPN·HUB·CRACK
Как у вас угонят бота: три дыры и защита от них · VPN HUB CRACK
Как у вас угонят бота: три дыры и защита от них
Как у вас угонят бота: три дыры и защита от них
Бот продаёт подписки и живёт годами, пока однажды не перестаёт отвечать. Telegram выдал ограничение, клиенты не могут оплатить, а вы даже не понимаете, за что.
Разберём случай, который произошёл на днях с ботом знакомого. Три дыры, все закрываются за полчаса.
📖 Незнакомые слова? Все термины простыми словами есть в Словаре терминов.
Дыра первая: бота добавляют в чужой чат
По умолчанию любой человек может добавить вашего бота в свою супергруппу. Если админку ему при этом не выдать, Telegram считает бота обычным участником, и на него распространяются те же санкции, что и на людей.
Дальше просто: злоумышленник добавляет бота в помойный чат, там начинается спам, прилетают жалобы, ограничение получает бот. Вместе с ограничением вы теряете возможность отвечать клиентам.
Закрывается в BotFather за минуту:
/mybots → ваш бот → Bot Settings → Allow Groups? → Turn groups off
Проверить, закрыта ли дыра у вас:
curl -s "https://api.telegram.org/bot<ТОКЕН>/getMe" | grep -o '"can_join_groups":[a-z]*'
Ответ должен быть "can_join_groups":false. Если true, идите в BotFather.
Заодно выключите там же Group Privacy и инлайн-режим, если не пользуетесь: чем меньше поверхности, тем меньше поводов для жалоб.
Дыра вторая: невидимые символы обходят ограничения
Telegram режет однотипные сообщения: одинаковый текст подряд получает FloodWait, и бот замолкает. На этом держится защита от спама.
Обходят её невидимыми символами. Отправляют не /start, а /start со склеенным символом-невидимкой. Для человека строки выглядят одинаково, для Telegram это разные сообщения, ограничение не срабатывает, а бот исправно отвечает на каждое.
Проверил, что именно работает:
| Символ | Пробельный | Уберёт ли .strip() |
|---|---|---|
| U+2000 EN QUAD | да | да |
| U+3164 HANGUL FILLER | нет | нет |
| U+200B ZERO WIDTH SPACE | нет | нет |
| U+FEFF BOM | нет | нет |
| U+2800 BRAILLE PATTERN BLANK | нет | нет |
Обычная очистка текста снимает только настоящие пробелы. Хангыльский филлер и его родня проходят насквозь. Нормализация NFKC тоже не спасает: она превращает U+3164 в другой невидимый символ, а не удаляет его.
Защита состоит из двух частей.
Первая: чистить входящий текст от невидимок перед любой обработкой.
import re, unicodedata
# Символы, которых в осмысленном пользовательском вводе не бывает:
# управляющие (Cf), суррогаты, филлеры и «пустые» глифы.
_INVISIBLE = re.compile(
r"[---"
r"ㅤᅟᅠ឴឵⠀]"
)
def clean(text: str) -> str:
text = unicodedata.normalize("NFKC", text or "")
text = _INVISIBLE.sub("", text)
# схлопываем любые пробельные подряд в один
return re.sub(r"\s+", " ", text).strip()
Вторая: не полагаться на ограничения Telegram, держать свой счётчик.
import time
from collections import defaultdict
_hits: dict[int, list[float]] = defaultdict(list)
LIMIT, WINDOW = 20, 60 # 20 сообщений в минуту на человека
def too_fast(user_id: int) -> bool:
now = time.time()
hits = [t for t in _hits[user_id] if now - t < WINDOW]
hits.append(now)
_hits[user_id] = hits
return len(hits) > LIMIT
⚠️ Предупреждать нарушителя можно один раз за эпизод мута, а не на каждое сообщение. Проверка «мут начался только что» по времени выглядит разумно, но флудер шлёт сотни сообщений в секунду, и все они попадают в это окно: бот отвечает на каждое и становится усилителем того самого спама. Держите отдельную отметку «этому уже сказали» и снимайте её, когда мут кончится. Мы поймали это на своём боте тестом, до боевой эксплуатации.
Дальше в обработчике: почистили текст, проверили счётчик, и только потом работаете. Команды сверяйте с точным списком, а не по началу строки: /start и /startㅤ после очистки станут одинаковыми, а вот /startattack командой быть не должно.
Дыра третья: через бота проходит запрещённое
Если бот принимает текст от людей и куда-то его передаёт (в поддержку, в отзывы, в общий чат), через него можно пропустить что угодно: ссылки на фишинг, рекламу, оскорбления, упоминания запрещённого контента. Жалоба прилетит на бота.
Фильтр держите по категориям, а не одним списком:
BAN_PATTERNS = [
r"t\.me/(spambot|premiumbot|botfather)\b", # подделки под сервисы Telegram
r"t\.me/\+?\d{10,}", # ссылки-приглашения по номеру
r"\b(childporn|cp|порн\w*|детск\w+\s+порн\w*)\b",
r"\b(scam|phishing|фишинг|скам)\b",
r"\b(казино|ставк\w+|crypto\s*drop)\b", # типовой спам
]
Расистские и оскорбительные слова добавьте отдельным списком: держите его в файле, а не в коде, чтобы пополнять без выкатки. Проверять надо после очистки от невидимок, иначе порно с нулевой шириной внутри пройдёт мимо фильтра.
Что делать при срабатывании: не отвечать пользователю, записать в журнал, после трёх срабатываний добавлять в свой блок-лист. Молчание лучше ответа: спамеру не за что зацепиться.
Проверьте свой бот за пять минут
TOKEN=<ваш токен>
# 1. Дыра с группами закрыта?
curl -s "https://api.telegram.org/bot$TOKEN/getMe" | python3 -m json.tool | grep can_
# 2. Бот не ограничен прямо сейчас?
curl -s "https://api.telegram.org/bot$TOKEN/getMe" | grep -q '"ok":true' && echo "живой"
# 3. Нет ли забытых вебхуков (частый след взлома)
curl -s "https://api.telegram.org/bot$TOKEN/getWebhookInfo" | python3 -m json.tool
В ответе getWebhookInfo смотрите на url. Чужой адрес там означает, что ваш токен у кого-то есть и обновления уходят на сторону.
Если бота уже ограничили
Пишите в @spambot с аккаунта владельца: он показывает статус и принимает апелляцию. До ответа закройте дыры, иначе ограничение вернётся.
Токен при подозрении на утечку меняйте сразу: BotFather → /revoke. Старый перестанет работать, не забудьте обновить его в конфигурации сервиса.
Коротко
- Запретите добавлять бота в группы: BotFather,
Allow Groups? → off. - Чистите входящий текст от невидимых символов до всякой логики.
- Держите свой счётчик сообщений, не надейтесь на лимиты Telegram.
- Фильтруйте пользовательский текст по категориям, проверяйте после очистки.
- Раз в месяц смотрите
getWebhookInfoна чужие адреса.
Что дальше
- Чёрный список нарушителей и защита от накрутки: «Чёрный список».
- Антифрод в платежах: «Антифрод и антиабуз».
- Общая гигиена доступов: «Защита панели и доступов».