Некоторое время назад я рассказывал про свой проект Не звони!, где при добавлении своего номера телефона в реестр необходимо подтвердить, что это твой номер.
Стандартные методы подтверждения — SMS или звонком довольно неплохи, но небесплатны. У используемого нами SMS.ru, например, одна SMS стоит 1,5 рубля («SMS за 25 копеек», что сказано у них на главной — это ложь, такого тарифа нет).
Какие бесплатные способы подтверждения номера есть? Мне в голову пришли следующие:
- Попросить пользователя отправить нам SMS со своего номера. Найти бесплатный российский номер, который бы принимал SMS и пересылал их, например, на почту — не удалось (раньше такая опция была у Zadarma). Использование нероссийского номера — отпугнуло бы пользователей. Альтернативное решение — личный номер, android и приложение типа SMS Gateway — не внушает доверия в плане надежности и пропускной способности.
- Попросить пользователя позвонить нам со своего номера. Еще более сложно реализуемый вариант.
- Проверка через 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, как я понимаю, не существует, потому тот, кто справится, ничего особо не получит. Хотя, можно будет какую-нибудь информацию о ком-нибудь получить, например, в боте банка Тинькофф ;).
Комментарии (23)
TimsTims
22.05.2017 23:05-3> думаю, такого номера не существует
Существует. Это абонент Билайна, имя называть не буду.
aol-nnov
22.05.2017 23:51+7в одном забугорном сервисе я видал просто гениальный способ подтверждения номера:
«мы вам прямо сейчас позвоним, только вы не отвечайте — всё равно не успеете. а теперь введите в это текстовое поле номер, с которого был пропущенный звонок»
а тут телеграмы, вайбиры… фи!.. ;)and7ey
23.05.2017 12:11Если телефонов, с которых звонят, немного, то через некоторое количество попыток эти телефоны станут известны
aol-nnov
23.05.2017 13:08на кредитке пин трехзначный, однако, все пины до сих пор не подобраны. понимаешь, о чем я? :)
QDeathNick
23.05.2017 13:37Достаточно предлагать в списке выбрать номер с которого звонили или последние цифры номера.
and7ey
23.05.2017 17:14Предлагать список возможных номеров? И тем самым сделать подбор ещё более простым? Зачем?
QDeathNick
23.05.2017 17:42Затем чтобы упростить. Во многих случаях такой защиты будет достаточно. С первого(второго) раза не угадал, до свиданья, вводи другой номер, явно подбирают.
Если надо наоборот усложнить, попросите несколько раз ввести номер с которого позвонили.
Например в вашем "Не звони!" мне кажется достаточным и предложенного мной варианта. Никто не будет злоупотреблять и пытаться угадать номер. Тем более владельцу номера может показаться и подозрительным, что на его номер постоянно кто-то прозванивается и он может выйти на вас введя в поиске номер определившегося телефона.and7ey
23.05.2017 20:32В целом — да, такой вариант возможен. Только нужно где-то взять множество номеров.
and7ey
23.05.2017 17:13На кредитка не PIN, а CVV или CVC. Вариантов там 1000. Номеров телефонов для звонков вряд ли столько же. + У карт есть другие методы защиты — например, 3D Secure. Или владелец карты узнает о транзакции — тут такого ничего нет (и даже задержки/блокировки в переборе со стороны сервера не особо помогут).
QDeathNick
23.05.2017 17:533D secure совсем не защита, она же не обязательна, деньги можно снять и без неё.
Владелец телефона то как раз узнает. что кто-то перебирает его номер, если кто-то начнёт перебирать, звонки же владельцу пойдут.
and7ey
23.05.2017 20:34Для снятия денег нужен ПИН. 3 неверных попытки ввести ПИН и банкомат карту забирает — ПИНы особо не сможешь перебрать.
Касательно звонков — да, верно, не подумал об этом почему-то.
alexsibtone
23.05.2017 05:27Как вариант — на сайте показать пользователю какое либо число и номер телефона по которому сделать дозвон.
Есть сигнализация preanswer — во время нее тарификация не идет (проверял на mtt, таймаут ~ 18 сек), можно абоненту проиграть сообщение и получить от него тоновый DTMF набор цифр, которые мы на сайте ему показали.and7ey
23.05.2017 20:34Зачем просить код? Ведь достаточно самого факта звонка (если АОН работает корректно).
Gorodnya
24.05.2017 10:24aol-nnov написал реальный пример. А вот ещё один, который Приват в Украине ранее реализовывал: для подтверждения на ваш номер звонит автоответчик, и нужно указать часть номера телефона входящего звонка.
and7ey
24.05.2017 11:06Это немного разные варианты. Выше писали про входящие звонки, тут речь про исходящий звонок.
Gorodnya
24.05.2017 12:55У них были разные варианты. Некоторое время было, что сам клиент для авторизации должен был позвонить на тот номер, который указывает банк в данный момент на странице.
Потом, после недовольства общественности, этот вариант сменили на «введите последние 4 цифры номера звонящего».
alexyr
Не нажимая на кнопку, просто выбрав как attachment?
and7ey
Да (только attachment = Contact, а не File)