Что можно узнать, перехватив HTTP и HTTPS запросы?

Ответ

При перехвате сетевых запросов объем доступной информации кардинально зависит от использования шифрования (HTTPS).

При перехвате HTTP-запроса (нешифрованного)

Злоумышленник может получить практически всю информацию в открытом виде:

  • URL и все его параметры: http://example.com/login?user=admin&pass=123
  • Метод запроса: GET, POST, PUT и т.д.
  • Все заголовки (Headers): Cookie, User-Agent, Authorization и другие, которые могут содержать сессионные данные.
  • Тело запроса (Body): для POST/PUT запросов это могут быть логины, пароли, номера карт, личные сообщения и любые другие передаваемые данные.

При перехвате HTTPS-запроса (шифрованного)

Благодаря TLS-шифрованию, основное содержимое запроса защищено:

  • Что защищено (зашифровано): URL (кроме домена), параметры, заголовки и тело запроса.
  • Что остается видимым (метаданные):
    • IP-адрес сервера и клиента.
    • Доменное имя сервера (благодаря механизму SNI, Server Name Indication, который необходим для работы виртуального хостинга).
    • Примерный объем переданных данных.

Пример уязвимого кода на Go (использование HTTP):

// ВНИМАНИЕ: Пароль передается в открытом виде в URL!
resp, err := http.Get("http://example.com/login?user=admin&pass=123")

Как защититься?

  1. Всегда используйте HTTPS для всех коммуникаций.
  2. Не передавайте чувствительные данные (пароли, токены) в параметрах URL, так как они могут логироваться на серверах и в браузерах.
  3. Для аутентификации используйте стандартные подходы, например, передачу JWT в заголовке Authorization: Bearer <token>.

Ответ 18+ 🔞

А, слушай, смотри, вот какая история. Представь, что ты подслушиваешь разговор в маршрутке. Всё зависит от того, орут они просто так или шепчутся в ухо.

Если это просто HTTP, как орать в маршрутке (без шифрования) Тут вообще пиздец, всё как на ладони. Любой, кто рядом, слышит всё, до последней буквы.

  • Куда и с чем лезешь (URL): http://example.com/login?user=admin&pass=123 — да ты посмотри, он пароль прямо в адресной строке написал, ёпта! Мудак, блядь.
  • Как лезешь (метод): GET, POST — ну, это уже детали, но тоже видно.
  • Всякие бумажки (заголовки): Cookie, Authorization — это вообще твои пропуска, сессии, ключи. Всё это лежит открыто, как говно в проруби.
  • Самое сокровенное (тело запроса): Логины, пароли, номера карточек, интимные переписки — всё, что отправил, всё ушло в открытую, как будто на репродуктор на площади.

А если это HTTPS, как шептаться в ухо (с шифрованием) Тут уже ёперный театр, нормальные люди так и делают. Всё зашифровано, а злоумышленник видит только метаданные, то есть обёртку.

  • Что спрятано (зашифровано): Сам URL (кроме домена), все параметры, заголовки и тело. То есть суть разговора.
  • Что всё равно торчит наружу (метаданные):
    • IP-адреса — откуда и куда.
    • Доменное имя (типа example.com) — потому что иначе сервер не поймёт, куда ты вообще стучишься (этот SNI, блядь, такой прикол).
    • Размер переданного — ну, много или мало ты нашептал.

Вот, смотри, как НЕ НАДО делать, пример уязвимого кода на Go:

// ВНИМАНИЕ: Пароль передается в открытом виде в URL!
resp, err := http.Get("http://example.com/login?user=admin&pass=123")

Видишь? Это как кричать свой пароль в толпу. Пиздец, просто.

Так как же не облажаться?

  1. ВСЕГДА, блядь, используй HTTPS. Это как базовый инстинкт выживания в сети. Никаких «ой, тут ничего важного». Всё важно.
  2. Не пихай секреты в URL. Пароли, токены — нихуя не в параметры адреса. Они потом в логах сервера, истории браузера остаются, как говно на подошве.
  3. Делай по-взрослому. Для авторизации используй нормальные методы. Например, кидай JWT-токен в заголовок Authorization: Bearer <token>. Это стандартно, безопасно и ни у кого не вызовет удивления, пиздец.