Технологии

Позвоните сами: как работает OTP входящим звонком и почему ботам тут не место

← Все статьи

Про OTP входящим звонком сейчас говорят все. С 1 ноября Flash Call на AutoCall.kz будет отключён, и бизнес ищет чем его заменить. А мы в поддержке каждый день объясняем одно и то же: как это вообще работает и кто кому звонит.

Поэтому собрали всё в одну статью: как работает входящий звонок, чем отличаются четыре способа, как мошенники обходят любые коды и как сделать проверку, на которой бот сломается. С мемами, ведь так будет веселее.

Зачем бизнесу вообще OTP

Код подтверждения нужен не для галочки. Он отвечает на простые вопросы.

  • Номер правда принадлежит этому человеку, а не взят из головы или из чужой базы.
  • Регистрируется живой человек, а не скрипт, который за ночь заводит тысячу аккаунтов.
  • Вход, смену пароля или перевод делает владелец аккаунта, а не кто-то с его паролем.

Если OTP легко обойти, то в базе копятся фейки и бонусы за регистрацию уходят ботам, а ваши рассылки летят на мёртвые номера.

Как работает входящий звонок

Обычно код отправляем мы: SMS, сообщение в WhatsApp или в Telegram. Тут наоборот: звонит сам пользователь.

  1. Пользователь вводит свой номер у вас на сайте, например +7 701 123 45 67.
  2. Ваш сервер отправляет нам запрос, мы отвечаем номером, на который надо позвонить. Например +7 747 000 00 00.
  3. Вы показываете кнопку «Позвонить». На телефоне она сразу открывает набор.
  4. Пользователь звонит со своего номера. Мы видим, кто звонит и куда. Совпало, значит это он.
  5. Вам приходит вебхук: номер подтверждён. Не позвонил за 2 минуты? Значит не подтверждён.

Подробно с примерами запросов разобрали на странице входящего звонка.

Плюсы. Быстро: одно нажатие. Дёшево: маяк стоит от 2 ₸, это самый дешёвый способ из всех. Работает без интернета на всех операторах. И не нарушает п. 3-1 ст. 21 Закона «О связи», потому что звоним не мы, а звонит сам пользователь. Ну и необычно - такое запоминается.

Минус по сути один: звонить должен пользователь. Кто-то не любит звонить, у кого-то ноль на балансе. Для таких оставьте запасной вариант через WhatsApp или Telegram.

Как мошенники обходят OTP

Прежде чем ставить оценки, давайте честно обсудим несколько фактов о противнике. Информация взята из открытых источников. Вот "стандартный набор" мошенника:

  • Сим-фермы и GSM-шлюзы. Ящик или целая стойка на десятки и сотни сим-карт. Принимают SMS, звонят, держат аккаунты в мессенджерах. Номера настоящие, местные.
  • Номера в аренду. Сервисы, где номер для приёма SMS сдают на 15 минут за копейки. Получил код, вернул номер.
  • Серые SIP-транки и подмена номера. Звонок идёт через интернет-телефонию, а в поле «кто звонит» подставляют любой номер. Операторы такое режут, но серые провайдеры находят дыры.
  • Боты с ИИ. Распознать речь, прочитать картинку, сказать фразу синтезом сегодня стоит копейки.

Абсолютной защиты не бывает. Задача OTP сделать обход дороже, чем стоит то, ради чего его обходят.

P.S. Недавние события с дата-центрами Яндекс наглядно показали, что боты могут спокойно обходить защиту в социальных сетях X (бывш. Twitter), Threads и Instagram, где в основном используются OTP через SMS и WhatsApp.

Разбор всех способов

SMS

Классика. Код приходит текстом, пользователь вводит его у вас.

Удобство ★★★★★
Безопасность ★★☆☆☆
Сложность обхода для мошенника ★★☆☆☆
Как обходят: номера в аренду и сим-фермы. Код получает тот, у кого сим-карта, а сим-карт у ферм много. Цена от 18.95 ₸, самый дорогой способ.

WhatsApp и Telegram

Код приходит в мессенджер. В WhatsApp с кнопкой «Копировать», в Telegram от официального бота. Платите только за доставленные.

Удобство ★★★★★
Безопасность ★★★☆☆
Сложность обхода для мошенника ★★★☆☆
Как обходят: на номере нужен живой аккаунт мессенджера. Фермы это умеют, но каждый аккаунт им обходится дороже, чем просто сим-карта. WhatsApp от 11 ₸, Telegram от 7 ₸.

Маяк missed

Пользователь звонит, мы не берём трубку. Он слышит «занято», звонок для него бесплатный. Сам факт звонка с нужного номера и есть подтверждение.

Вот и весь звонок. Номер подтверждён
Удобство ★★★★★
Безопасность ★★☆☆☆
Сложность обхода для мошенника ★★☆☆☆
Как обходят: подмена номера через серый SIP-транк или звонок с сим-фермы. Для бота это просто звонок, ни слушать, ни говорить не надо. От 2 ₸.

Прослушать listen

Пользователь звонит, робот называет вашу компанию и код. Пользователь вводит код у вас в приложении. Вот так это звучит в трубке:

listen: код звучит дважды, чтобы успеть запомнить
Удобство ★★★☆☆
Безопасность ★★★☆☆
Сложность обхода для мошенника ★★★☆☆
Как обходят: бот должен принять звонок, записать звук и распознать цифры. Уже не просто звонок, но и не космос. От 5 ₸.

Набрать press

Код показан у вас на экране. Пользователь звонит и набирает его на клавиатуре телефона. Три ошибки, и всё, заявка не прошла.

press: сначала набрали не то, потом правильно
Удобство ★★★☆☆
Безопасность ★★★★☆
Сложность обхода для мошенника ★★★☆☆
Как обходят: бот, который сам ведёт регистрацию, видит код на экране так же, как человек. Значит ему нужно позвонить с нужного номера и набрать цифры за 2 минуты. Проще, чем кажется, поэтому ниже лайфхак, который это ломает. От 3 ₸.

Назвать say

Пользователь звонит и называет код вслух: цифры или слово. Речь распознаём сами, на русском и казахском.

say по-казахски: назовите слово с экрана
Удобство ★★★★☆
Безопасность ★★★★☆
Сложность обхода для мошенника ★★★★☆
Как обходят: боту нужен синтез речи прямо во время звонка, и он должен внятно сказать слово. С казахским у синтеза пока бывают проблемы, и это нам на руку. От 7 ₸.

Сводная таблица

Способ Удобство Безопасность Сложность обхода Цена
SMS ★★★★★ ★★☆☆☆ ★★☆☆☆ от 18.95 ₸
WhatsApp, Telegram ★★★★★ ★★★☆☆ ★★★☆☆ от 7 ₸
Маяк missed ★★★★★ ★★☆☆☆ ★★☆☆☆ от 2 ₸
Прослушать listen ★★★☆☆ ★★★☆☆ ★★★☆☆ от 5 ₸
Набрать press ★★★☆☆ ★★★★☆ ★★★☆☆ от 3 ₸
Назвать say ★★★★☆ ★★★★☆ ★★★★☆ от 7 ₸
press или say с задачей ★★★☆☆ ★★★★★ ★★★★★ как press или say

Хороший OTP это баланс между удобством, скоростью, ценой и защитой. Для обычной регистрации в доставке хватит маяка. Раздаёте бонусы за регистрацию? Берите press с задачей. Переводы денег и смена пароля? press с датой рождения или say.

Лайфхаки: делаем press и say злее

Самое интересное. Код на экране не обязан быть просто кодом. Вы сами решаете, что показать пользователю, а мы только сверяем ответ.

1. press: задача вместо кода

Не показывайте код, покажите пример. В запросе передаёте "code": "5922", а на экране картинкой рисуете вот это:

ваше приложение
Подтвердите номер
Позвоните и наберите ответ на клавиатуре
4921 + 1001 = ?
📞 Позвонить
осталось 1:54

Человек посчитает в уме за пять секунд. Боту надо распознать картинку, посчитать, позвонить с нужного номера и набрать ответ, и всё это успеть за 2 минуты. Можно, но каждая такая регистрация начинает стоить денег и ресурсов злоумышленнику.

Для переводов денег и других важных операций попросите набрать дату рождения в формате ДДММГГГГ, это 8 цифр. Её знает владелец аккаунта, а бот с чужим номером нет.

2. say: казахский, уровень «бог»

Назовите слово, которое на экране:

ваше приложение
Растау
Қоңырау шалып, мына сөзді айтыңыз
Қанағаттандырылмағандықтарыңыздан
📞 Қоңырау шалу

33 буквы! Мы сами с первого раза выговариваем через раз. Синтезу речи тоже тяжело, а настоящий казахстанец хотя бы попробует и посмеётся. Хотя для реальных пользователей лучше слово попроще, мы же не экзамен принимаем.

3. say: вопрос, который поймёт только местный

Код не обязательно показывать. Покажите картинку и спросите о ней.

ваше приложение
Подтвердите номер
Мем «Мен магазинге нанға кеттім»
Позвоните и скажите: о какой сумме тут идёт речь?
📞 Позвонить

Ответ: пятьсот семьдесят. Кто знает, тот поймёт. Зумер из Алматы ответит не задумываясь, ферма из соседней страны будет гуглить, пока не кончатся 2 минуты. В запросе это просто "code": "570". Засчитаем и «пятьсот семьдесят» и «бес жүз жетпіс теңге» как за правильный ответ.

4. say: ЧБД - что было дальше?

ваше приложение
Что было дальше?
Мужчина с телефонной трубкой
  1. Сломает трубку: скажите «трубка»
  2. Сядет на стул и упадёт: «стул»
  3. Недовольно махнёт рукой: «рука»
  4. Уронит шапку: «шапка»
📞 Позвонить и ответить

Правильный ответ «рука», и это ваш код: "code": "рука". Видео все видели, а боты нет. Говорящие картинки существуют!

5. Подбирайте вопрос под человека

Вопросы вы выбираете на своей стороне, так что их можно подстроить под пользователя. Молодым мем из тиктока, тем кто постарше «В каком городе стоит Байтерек?». Ответ «Астана» знает каждый, а вот бот из-за границы сначала должен понять, что такое Байтерек. Используя дешёвый TTS без казахского языка, мошенник скорее всего произнесёт "БайтЭрЭк" - что не будет считаться правильным ответом.

И ещё один момент о котором часто забывают. В press и say пользователь подтверждает не только номер. Он заодно доказывает, что он живой человек, понимает язык и может говорить. Это больше, чем даёт любая SMS.

Как подключить

Один запрос к API. Тип проверки в поле type, а код или слово в code:

POST https://autocall.kz/api/v1/otp/incoming-call
Authorization: Bearer {ваш_токен}
Content-Type: application/json

{
  "number": "+77011234567",
  "type": "press",
  "code": "5922",
  "language": ["kk", "ru"],
  "brand": "Clinic Plus",
  "callback_url": "https://example.kz/otp-hook"
}

В ответе придёт call_to: номер для кнопки «Позвонить». Итог прилетит вебхуком. Попробовать на себе можно прямо на странице входящего звонка, это бесплатно.

Надеемся, что эта статья поможет вам лучше понять как работают OTP с входящими звонками.

Творите, импровизируйте и защищайте свои приложения, стартапы, сервера только надежными и безопасными OTP с адекватными ценами!

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

Платит ли пользователь за звонок?

В маяке нет: мы не берём трубку, пользователь слышит «занято», и звонок бесплатный. В listen, press и say мы отвечаем на звонок, и он оплачивается как обычный исходящий по тарифу пользователя.

Что если пользователь звонит со скрытого номера?

Такой звонок сразу сбрасывается. Подтвердить номер можно только звонком с того номера, который вы передали в запросе.

Какой способ выбрать?

Для обычной регистрации хватит маяка. Если за регистрацию дают бонусы или промокоды, берите press с задачей вместо кода. Для переводов денег и смены пароля press с датой рождения или say.

Попробуйте входящий звонок на своём номере

Без договора и абонентской платы.
Тестовый баланс сразу после регистрации.

Зарегистрироваться бесплатно →