Authorization weakness in TG bots
Внимание!
Материал будет крайне полезен всем разработчикам телеграмм ботов
Суть
Задумывались ли вы над авторизацией в своих ботах? А над привязкой номера телефона к аккаунту?
Просто дать пользователю ввести свой номер в теле сообщения даже звучит небезопасно. Поэтому многие из вас уже решили использовать кнопку "отправить мой контактный номер", по нажатию на которую отправляется не текст, а объект Contact.
Скорее всего даже если и сами вы не делали подобного, то уж точно видели в популярных ботах.
И ведь большинство разработчиков забывает про то, что такой же объект Contact можно скинуть через вложение
В таком случае часто можно получить демо-доступ от имени другого человека или влезть в его кабинет при отсутствии мер защиты.
Как противостоять?
Контакты отправляются через метод API sendContact. (поля, которые принимает метод: https://core.telegram.org/bots/api#sendcontact)
Контакты приходят получателю в виде объекта Contact, с полями: https://core.telegram.org/bots/api#contact
То есть, при отправке поля user_id нет, при получении поле user_id может присутствовать.
Оно присутствует только у номеров, которые зарегистрированы в телеграмме и соответствует user_id владельца номера.
То есть получается, что поле user_id в объект Contact подставляет сам телеграмм.
Исходя из этого: сравнив user_id в присланном контакте с user_id отправителя сообщения мы можем понять, что человек сам отправляет контакты или кто то делает это за него. Что позволяет однозначно связать номер телефона с владельцем аккаунта телеграмм и дать доступ к нашим сервисам.
Итого:
Сравнивайте user_id в присланном контакте с user_id отправителя сообщения, чтобы вам не подкинули чужой контакт