Pull to refresh

Необычное применение бота для Telegram и проверка защиты Telegram

Reading time2 min
Views25K

Некоторое время назад я рассказывал про свой проект Не звони!, где при добавлении своего номера телефона в реестр необходимо подтвердить, что это твой номер.

Стандартные методы подтверждения — SMS или звонком довольно неплохи, но небесплатны. У используемого нами SMS.ru, например, одна SMS стоит 1,5 рубля («SMS за 25 копеек», что сказано у них на главной — это ложь, такого тарифа нет).

Какие бесплатные способы подтверждения номера есть? Мне в голову пришли следующие:

  1. Попросить пользователя отправить нам SMS со своего номера. Найти бесплатный российский номер, который бы принимал SMS и пересылал их, например, на почту — не удалось (раньше такая опция была у Zadarma). Использование нероссийского номера — отпугнуло бы пользователей. Альтернативное решение — личный номер, android и приложение типа SMS Gateway — не внушает доверия в плане надежности и пропускной способности.
  2. Попросить пользователя позвонить нам со своего номера. Еще более сложно реализуемый вариант.
  3. Проверка через Telegram.

Последний вариант показался интересным. Как это работает? Бот просит пользователя выбрать сайт для авторизации, а затем запрашивает номер телефона пользователя. Если пользователь свой номер телефона сообщает, то бот подтверждает номер телефона на выбранном сайте.

В Telegram Bot API можно запросить у пользователя его номер телефона:

>>> contact_keyboard = telegram.KeyboardButton(text="send_contact", request_contact=True)
>>> custom_keyboard = [[ contact_keyboard ]]
>>> reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard)
>>> bot.send_Message(chat_id=chat_id, 
...                  text="Would you mind sharing your contact with me?", 
...                  reply_markup=reply_markup)

Если пользователь соглашается отдать боту свой номер телефона, то бот получает следующее:

{
  "update_id": 912872664,
  "message": {
    "message_id": 57,
    "from": {
      "id": 777777,
      "first_name": "Ne Dimon",
      "last_name": "On vam",
      "username": "onvamnedimon"
    },
    "chat": {
      "id": 777777,
      "first_name": "Ne Dimon",
      "last_name": "On vam",
      "username": "onvamnedimon",
      "type": "private"
    },
    "date": 1492274787,
    "contact": {
      "phone_number": "79160000001",
      "first_name": "Ne Dimon",
      "last_name": "On vam",
      "user_id": 777777
    }
  }
}

Может ли пользователь прислать не свой номер телефона? Может. Пользователь вместо ответа «Да» боту может выслать любой другой контакт из своей телефонной книжки. Но при этом contact/user_id в этом случае не будут равны from/id, и бот узнает, что ему прислали чужой контакт.

Меня интересовал вопрос — можно ли используя модифицированный клиент Telegram отправить чужой номер телефона со своим id. @BotSupport Telegram утверждает, что это сделать нельзя (возможно, есть проверка на сервере). Но я им (особенно русскоязычной поддержке) не особо доверяю, потому предлагаю задачу — подтвердить номер (916) 000-00-01 на нашем сайте (проверил, по данному номеру «абонент не доступен», думаю, такого номера не существует). Для этого необходимо перейти по ссылке бота и на запрос номера отправить ему номер (916) 000-00-01 с вашим id.
Постоянной программы Bug Bounty у Telegram, как я понимаю, не существует, потому тот, кто справится, ничего особо не получит. Хотя, можно будет какую-нибудь информацию о ком-нибудь получить, например, в боте банка Тинькофф ;).
Tags:
Hubs:
Total votes 20: ↑16 and ↓4+12
Comments24

Articles