Даже при корректной аутентификации приложение остается уязвимым, если сетевой слой и серверная валидация реализованы неправильно. В этой части поговорим о защите сетевых запросов, доверии к данным и проверке OTP.
1. SSL pinning — обязательное требование
Без pinning HTTPS не спасает от атаки MITM (Man In The Middle), когда злоумышленники перехватывают трафик между приложением и сервером, а потом читают или подменяют запросы через прокси или wi-fi:
final context = SecurityContext(withTrustedRoots: false);
context.setTrustedCertificatesBytes(certBytes);
final httpClient = HttpClient(context: context);
final dio = Dio()
..httpClientAdapter = IOHttpClientAdapter(
createHttpClient: () => httpClient,
);
Это блокирует:
- proxy
- fake Wi-Fi
- подмену сертификатов
2. OTP всегда проверяется на сервере
Проверка OTP на клиенте — критическая уязвимость:
if (enteredOtp == "123456") success();
Только сервер:
await api.verifyOtp(
mobile: mobile,
otp: enteredOtp,
);
3. Клиентская валидация — не финальная. Данные всегда проверяются на сервере:
bool isValidAmount(String value) {
final amount = double.tryParse(value);
return amount != null && amount > 0 && amount < 100000;
}
Эти меры закрывают большую часть рисков, но сами по себе они не решают все. Даже при защищенном трафике и корректной логике на бэке приложение остается уязвимым на уровне устройства и интерфейса.
В следующей части разберем защиту UI, работу с сессиями и ограничения на уровне устройства.
