Аутентификация: парадная дверь вашего приложения
Аутентификация — это то, как приложение проверяет личность пользователя. Это наиболее критичная для безопасности функция — все остальные меры безопасности зависят от корректной работы аутентификации. Баг в аутентификации может раскрыть данные всех пользователей.
Этот урок охватывает тестирование потоков аутентификации (вход, регистрация, восстановление пароля) и управление сессиями (как приложение отслеживает вашу личность после входа).
Тестирование потока входа
Позитивный сценарий
Начните с очевидного: валидные учётные данные должны работать.
- Вход с корректным email и паролем
- Проверка перенаправления на правильную страницу
- Проверка отображения имени или аватара пользователя в UI
- Проверка создания сессии (проверить cookies в DevTools)
Невалидные учётные данные
| Тест-кейс | Ожидаемое поведение |
|---|---|
| Неверный пароль | Общее сообщение: «Неверный email или пароль» (никогда не раскрывать, что именно неверно) |
| Несуществующий email | Такое же общее сообщение |
| Пустой email | Ошибка валидации до отправки |
| Пустой пароль | Ошибка валидации до отправки |
| SQL injection в email | Без SQL-ошибок, общее сообщение валидации |
| XSS в поле email | Ввод санитизирован, скрипт не выполняется |
Критическое замечание по безопасности: Сообщение об ошибке при неверном email и при неверном пароле должно быть одинаковым. Разные сообщения позволяют злоумышленникам перечислять существующие аккаунты.
Защита от перебора
Попробуйте войти с неправильными паролями многократно:
- После 3-5 неудачных попыток, показывает ли система CAPTCHA?
- После 10+ попыток, блокируется ли аккаунт или ограничивается частота?
- Есть ли период охлаждения? Какой длительности?
- Блокировка применяется к IP, к аккаунту или к обоим?
Социальный вход (OAuth)
Если приложение поддерживает вход через Google, GitHub, Facebook:
- Корректно ли работает поток OAuth?
- Что происходит, если пользователь отказывает в разрешении?
- Сопоставляется ли email из OAuth с существующим аккаунтом?
- Что происходит, если социальный провайдер недоступен?
Тестирование потока регистрации
Создание аккаунта
- Валидная регистрация со всеми обязательными полями
- Дублирующийся email — должен отклоняться с понятным сообщением
- Требования к сложности пароля — тестировать чуть ниже каждого требования
- Подтверждение email — работает ли ссылка подтверждения?
- Срок действия ссылки — истекает ли через разумное время?
Подтверждение email
- Зарегистрируйте новый аккаунт
- Проверьте, что письмо подтверждения приходит
- Перейдите по ссылке — аккаунт должен активироваться
- Перейдите по той же ссылке снова — должно показать «уже подтверждено»
- Попробуйте войти до подтверждения — должно показать соответствующее сообщение
Тестирование восстановления пароля
Поток «Забыли пароль»
- Запросите сброс пароля для валидного email
- Убедитесь, что письмо приходит в разумное время
- Перейдите по ссылке сброса — должна показаться форма сброса
- Установите новый пароль — должно успешно
- Войдите с новым паролем — должно работать
- Войдите со старым паролем — должно не работать
- Перейдите по ссылке сброса снова — должна быть просрочена
Граничные случаи безопасности
| Тест | Ожидаемо |
|---|---|
| Сброс для несуществующего email | Такое же сообщение, как для валидного (предотвращение перечисления) |
| Множественные запросы сброса | Только последняя ссылка должна работать |
| Ссылка сброса после смены пароля | Ссылка должна быть недействительной |
| Истечение ссылки (24ч+) | Ссылка должна истечь |
Управление сессиями
Создание и хранение сессий
После входа проверьте:
- Создана cookie сессии
- Cookie имеет флаг
Secure(только HTTPS) - Cookie имеет флаг
HttpOnly(недоступна для JavaScript) - Cookie имеет атрибут
SameSite - ID сессии достаточно длинный и случайный (минимум 128 бит)
- ID сессии меняется после входа (предотвращение session fixation)
Таймаут сессии
- Таймаут бездействия: После X минут бездействия сессия истекает
- Абсолютный таймаут: После Y часов независимо от активности сессия истекает
- Поведение при таймауте: Что происходит при истечении сессии? Перенаправление на вход? Модальное окно? Потеря несохранённой работы?
Продвинутое тестирование аутентификации
Параллельные сессии
Проверьте, что происходит, когда один пользователь входит с нескольких мест:
- Вход в Браузере А
- Вход в Браузере Б с тем же аккаунтом
- Выполните действие в Браузере А — сессия ещё действительна?
- Ограничивает ли приложение параллельные сессии?
- Если сессии ограничены, какая завершается — старая или новая?
Функциональность «Запомнить меня»
Если форма входа имеет чекбокс «Запомнить меня»:
- Как долго длится постоянная сессия? (Обычно 30 дней)
- Используется ли отдельный постоянный токен (не cookie сессии)?
- Может ли пользователь отозвать все запомненные сессии из настроек?
- Переживает ли «Запомнить меня» перезапуск браузера?
- Инвалидируется ли постоянный токен при смене пароля?
Многофакторная аутентификация (MFA)
Если приложение поддерживает MFA:
- Работает ли с приложениями-аутентификаторами (TOTP)?
- Работает ли с SMS-кодами?
- Что происходит с просроченным кодом?
- Что происходит при 3+ неправильных кодах?
- Можно ли обойти MFA, манипулируя запросом?
- Предоставляются ли резервные коды и работают ли они?
Упражнение: Аудит безопасности аутентификации
Проведите полный аудит аутентификации веб-приложения:
- Регистрация: Создайте аккаунт, проверьте дубликаты, верификацию email
- Вход: Проверьте валидные/невалидные данные, сообщения об ошибках на утечку перечисления
- Сессия: Проверьте cookies на флаги безопасности (Secure, HttpOnly, SameSite)
- Таймаут: Дождитесь истечения сессии, проверьте поведение
- Сброс пароля: Пройдите весь поток, проверьте истечение ссылки
- Параллельные сессии: Войдите из двух браузеров одновременно
- Выход: Проверьте уничтожение сессии — нажмите «Назад» после выхода
| Область | Тест | Находка | Риск |
|---|---|---|---|
| Вход | Сообщения об ошибках | Разные для неверного email и пароля | Высокий (перечисление) |
| Сессия | Флаги cookies | Отсутствует HttpOnly | Высокий (XSS может украсть сессию) |
| Сброс пароля | Истечение ссылки | Ссылка работает через 7 дней | Средний |
| Выход | Кнопка «Назад» | Показывает кэшированную аутентифицированную страницу | Средний |
Тестирование выхода
Выход часто недостаточно тестируется:
- Нажмите «Выход» — проверьте перенаправление на страницу входа
- Нажмите кнопку «Назад» — НЕ должен показывать аутентифицированный контент
- Попробуйте напрямую обратиться к аутентифицированному URL — должен перенаправить на вход
- Проверьте, что cookie сессии удалена или инвалидирована
- Проверьте, что серверная сессия уничтожена (не только удаление cookie)
- На отдельной открытой вкладке — что происходит при попытке выполнить действие?
Ключевые выводы
- Аутентификация — наиболее критичная для безопасности функция, тестируйте её исчерпывающе
- Сообщения об ошибках при входе должны быть общими для предотвращения перечисления аккаунтов
- Всегда проверяйте наличие флагов Secure, HttpOnly и SameSite у cookie сессии
- Тестируйте таймаут сессии и по бездействию, и абсолютный
- Ссылки сброса пароля должны истекать и инвалидироваться после использования
- ID сессии должны регенерироваться после входа для предотвращения session fixation
- Выход должен уничтожать сессию на стороне сервера, а не только удалять cookie