← Назад к вопросам

Почему не желательно отправлять конфиденциальные данные через GET запрос?

1.3 Junior🔥 111 комментариев
#Опыт и софт-скиллы#Сетевое взаимодействие

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Опасности передачи конфиденциальных данных через GET-запросы

Отправка конфиденциальных данных через GET-запросы крайне не рекомендуется по нескольким критически важным причинам, связанным с безопасностью и архитектурой приложений. Вот основные проблемы:

1. Данные остаются в истории браузера и логах серверов

GET-параметры передаются прямо в URL-строке, что приводит к их постоянному сохранению в различных местах:

// ПРИМЕР НЕБЕЗОПАСНОГО ЗАПРОСА:
// GET https://api.example.com/login?username=admin&password=Secret123

val unsafeUrl = "https://api.example.com/login?username=${username}&password=${password}"
// Данные будут видны в:
// - Истории браузера
// - Логах веб-сервера (nginx/apache)
// - Логах промежуточных прокси
// - Логах аналитики

2. Риск утечки через Referrer Header

Когда пользователь переходит с одной страницы на другую, браузер автоматически отправляет URL предыдущей страницы в заголовке Referer. Если в URL были конфиденциальные GET-параметры, они попадут на сторонние серверы.

// Пример утечки данных:
// 1. Пользователь на: https://bank.com/transfer?amount=1000&to=attacker
// 2. Переходит по внешней ссылке
// 3. Браузер отправляет: Referer: https://bank.com/transfer?amount=1000&to=attacker
// 4. Владелец внешнего сайта получает конфиденциальные данные

3. Уязвимость к атакам типа Man-in-the-Middle (MITM)

GET-запросы не шифруются по умолчанию. Даже при использовании HTTPS, URL может быть виден:

  • В логах корпоративных прокси-серверов
  • Через аналитику поисковых систем (если были клики из поиска)
  • В кэше DNS-серверов

4. Отсутствие защиты от CSRF-атак

GET-запросы уязвимы к Cross-Site Request Forgery, поскольку вредоносные сайты могут легко создать скрытые запросы:

<!-- Злонамеренная страница может выполнить -->
<img src="https://bank.com/transfer?amount=5000&to=attacker" width="0" height="0">

5. Ограничения длины URL

GET-запросы имеют ограничения на длину URL (обычно 2048 символов), что делает их неподходящими для передачи больших объемов данных.

Рекомендуемая альтернатива: Использование POST-запросов с HTTPS

Для передачи конфиденциальных данных следует использовать:

// БЕЗОПАСНЫЙ ПОДХОД: POST запрос с телом
val requestBody = Json.encodeToString(
    mapOf(
        "username" to username,
        "password" to password
    )
)

val request = Request.Builder()
    .url("https://api.example.com/login")
    .post(requestBody.toRequestBody("application/json".toMediaType()))
    .addHeader("Content-Type", "application/json")
    .build()

// Дополнительно используйте:
// 1. HTTPS с правильной конфигурацией (HSTS)
// 2. Токены аутентификации вместо передачи паролей
// 3. Шифрование чувствительных данных на клиенте
// 4. Защиту от CSRF-атак

Дополнительные меры безопасности для Android-приложений:

  1. Использование Certificate Pinning для защиты от MITM-атак
  2. Хранение чувствительных данных в Android Keystore
  3. Регулярная инвалидация токенов аутентификации
  4. Валидация SSL-сертификатов на уровне приложения
  5. Использование биометрической аутентификации для доступа к критическим операциям

Когда GET все-таки уместен:

  • Получение публичных данных (статьи, новости)
  • Параметры фильтрации (сортировка, пагинация)
  • Идентификаторы ресурсов (id продукта, категории)
  • Параметры аналитики (utm-метки)

Ключевой вывод: Конфиденциальные данные (пароли, токены, персональная информация, финансовые данные) никогда не должны передаваться через GET-запросы. Используйте POST/PUT запросы с обязательным HTTPS, добавляйте дополнительные слои шифрования и всегда следуйте принципу минимальных привилегий при проектировании API.

Почему не желательно отправлять конфиденциальные данные через GET запрос? | PrepBro