Как тестировать двухфакторную аутентификацию по SMS: позитивные и негативные сценарии
Что проверяют
Видите ли вы в 2FA не только форму ввода кода, но и защитный механизм, который будут пытаться обойти. Следом обычно спрашивают, как автоматизировать такие тесты без реальных SMS.
Как отвечать
Сначала уточните требования: длина кода, срок жизни, число попыток, пауза между повторными отправками, что происходит при блокировке. Без этих цифр негативные сценарии не сформулировать.
Позитивные сценарии:
- базовый вход: верный код в пределах срока жизни пускает, сессия создаётся;
- повторная отправка: после таймера приходит новый код, и работает именно он;
- удобство ввода: вставка из буфера, автоподстановка из SMS (
autocomplete="one-time-code"на вебе,textContentTypeсо значением.oneTimeCodeна iOS, SMS Retriever API на Android), разные форматы номера: с+7, с8, с пробелами и скобками.
Негативные сценарии:
- неверный и просроченный код: понятная ошибка, счётчик попыток уменьшается;
- старый код после повторной отправки: не принимается, как и уже использованный;
- лимиты: после N ошибок блокировка, частая повторная отправка упирается в паузу;
- привязка: код от одной сессии или номера не подходит к другой;
- обход интерфейса: перебор кодов и массовая отправка прямо через API, лимиты должны стоять на сервере;
- утечки: код не приходит в теле ответа, не пишется в логи и не попадает в URL;
- сбой доставки: SMS-провайдер недоступен, пользователь видит сообщение и альтернативный способ входа.
Для автотестов берут тестовые номера, заглушку провайдера или служебный эндпоинт стенда, который отдаёт последний код. Реальные SMS в регрессии это деньги и нестабильность.
Где спотыкаются
Проверяют лимиты только в интерфейсе. Кнопка заблокировалась, а API продолжает принимать попытки, и шестизначный код спокойно перебирается.
Забывают про массовую отправку. Злоумышленник гоняет SMS на платные номера за счёт компании, поэтому лимит нужен и на номер, и на IP.
Не проверяют, что старый код перестаёт действовать после выдачи нового. Тогда у пользователя висят несколько рабочих кодов, и окно для атаки растягивается.