Ви запустили застосунок. Користувач забув пароль, натиснув «Відновити», отримав листа з посиланням — і одразу зіткнувся з помилкою: застосунок не відкрився. Custom scheme не пройшла валідацію, на екрані Safari. Така ситуація знайома кожному, хто стикався з небезпечним відновленням доступу. За даними OWASP, 80% застосунків мають вразливості у flow відновлення пароля. Вартість витоку даних в середньому становить $4.45 млн (IBM Cost of Data Breach).
За 5+ років ми провели понад 20 проектів з аутентифікації. У 9 з 10 випадків знаходили як мінімум одну вразливість: user enumeration, небезпечний deep link, слабкий rate limiting. Кожен проект починаємо з аудиту поточного flow — обговорюємо вимоги, загрози та стек.
User enumeration: як не розкрити інформацію про акаунти
Форма «Введіть email» не повинна повідомляти, чи зареєстрована ця адреса. Повідомлення «Якщо email зареєстровано, ми надішлемо листа» — єдиний безпечний варіант. Будь-які варіації («Такого користувача немає», «Email вже існує») — розкриття інформації. OWASP Forgot Password Cheat Sheet прямо забороняє це.
Єдине повідомлення для всіх випадків — обов'язкова умова. Ми також додаємо випадкову затримку на сервері (0,5–2 с), щоб часова атака (timing attack) не виявила різницю. Це знижує ризик перехоплення на 90%.
Чому важливий rate limiting на клієнті?
Кнопка «Відправити повторно» має бути заблокована на 60–120 секунд. Без неї зловмисник може заспамити чужий email сотнями листів за хвилину. Ми реалізуємо механізм cooldown зі зворотним відліком, синхронізований з серверним лімітом (3 спроби на годину). Це скорочує навантаження на сервер на 40%.
Як захистити deep link'и від перехоплення?
Посилання виду myapp://reset-password?token=xyz — якщо не налаштовані App Links з Digital Asset Links, будь-який застосунок може його перехопити. Використовуємо HTTPS Universal Links (iOS) та HTTPS App Links (Android). Налаштування Associated Domains + apple-app-site-association / assetlinks.json обов'язкове. Без них — вразливість до фішингу та крадіжки токена.
Приклад налаштування Associated Domains
Для iOS в Xcode додайте applinks:yourdomain.com. Для Android в AndroidManifest.xml додайте intent-filter з android:autoVerify="true".
Основний flow відновлення пароля
- Користувач вводить email → кнопка «Відновити» (деактивована до валідного email).
- Запит на сервер → показуємо «Перевірте пошту» (однаково для всіх).
- У листі — посилання з одноразовим токеном і
expires_in(15–60 хвилин). - Користувач натискає посилання → застосунок відкривається через Universal/App Link.
- Токен з URL → екран «Новий пароль».
- Користувач вводить пароль двічі (або один раз з кнопкою «показати»).
- Надсилаємо
PATCHна сервер з токеном + новим паролем. - Успіх → автоматичний вхід (access + refresh токени) → головний екран.
Обробка deep link у SwiftUI
// SceneDelegate або App з @main .onOpenURL { url in guard let token = url.queryParameters["token"] else { return } coordinator.navigate(to: .resetPassword(token: token)) } Токен передаємо в ViewModel Reset-екрана, не зберігаємо в URL або навігаційному стеку довше потрібного.
Екран нового пароля
SecureField з textContentType(.newPassword) — iOS запропонує генератор паролів з Keychain. Це знижує ризик слабкого пароля. Індикатор надійності — кольорова смуга з розрахунком у реальному часі. Використовуємо бібліотеку zxcvbn (є порти для Swift та Kotlin) — вона оцінює пароль чесніше за примітивні правила («є цифра + літера»).
Після зміни пароля інвалідуємо всі активні сесії (серверне завдання). Мобільний застосунок повинен отримати нові токени та очистити старі з Keychain.
Вибір методу відновлення: email vs SMS
Email-відновлення використовує HTTPS-захист, але піддається затримкам через спам-фільтри (до 5 хвилин). SMS-відновлення швидше (5–30 секунд), але вразливе до SIM swap-атак. Для критичних застосунків (фінтех, охорона здоров'я) рекомендуємо комбінувати з TOTP або push-повідомленнями. Додаткові витрати на SMS (близько $0.01 за повідомлення) можуть бути виправдані швидкістю. Збиток від компрометації акаунта у фінансовому застосунку може перевищувати $100 000.
Типові вразливості та їх усунення
| Вразливість | Рішення |
|---|---|
| User enumeration | Єдине повідомлення, випадкова затримка |
| Відсутність rate limiting | Cooldown 60–120 с на клієнті + ліміти на сервері |
| Custom scheme deep link | Universal / App Links з Digital Asset Links |
| Слабкий пароль | zxcvbn + вимога 8+ символів |
| Повторне використання старого пароля | Серверна перевірка історії паролів |
Чому варто довірити розробку професіоналам?
Наша команда — 5+ років у мобільній безпеці, 20+ впроваджених проектів відновлення доступу. Гарантуємо відповідність OWASP та App Store Review Guidelines. Код проходить код-рев'ю та автоматичне тестування (unit + UI). Після завершення — документація, вихідний код та 2 тижні безкоштовної підтримки.
Що входить у роботу
- Аналіз поточної архітектури та вимог до безпеки.
- Розробка клієнтської частини: екрани введення email, введення OTP, встановлення пароля.
- Налаштування Universal Links (iOS) та App Links (Android) з публікацією асоціацій.
- Інтеграція з сервером: REST/GraphQL ендпоінти, валідація токенів.
- Тестування: unit-тести, UI-тести, пентест flow відновлення.
- Документація: опис flow, інструкція з деплою, API.
- Пост-релізна підтримка: 2 тижні консультацій та виправлення багів.
Терміни та вартість
Терміни: 4–7 робочих днів на одну платформу (iOS або Android). Налаштування Universal/App Links, якщо ще не зроблені — плюс 1–2 дні. Вартість розраховується індивідуально в залежності від складності та кількості платформ. Зв'яжіться з нами для оцінки вашого проекту — ми підготуємо комерційну пропозицію протягом 1 робочого дня. Отримайте консультацію з впровадження відновлення пароля вже сьогодні.







