Безопасна ли строка запроса HTTPS? - PullRequest
309 голосов
/ 27 ноября 2008

Я создаю безопасный веб-интерфейс API, использующий HTTPS; однако, если я разрешу пользователям настраивать его (включая отправку пароля) с помощью строки запроса, это также будет безопасно или я должен принудительно сделать это через POST?

Ответы [ 9 ]

409 голосов
/ 27 ноября 2008

Да, это так. Но использование GET для конфиденциальных данных - плохая идея по нескольким причинам:

  • В основном утечка реферера HTTP (внешнее изображение на целевой странице может утечь пароль [1])
  • Пароль будет храниться в логах сервера (что явно плохо)
  • Кэши истории в браузерах

Поэтому, хотя Querystring защищен, не рекомендуется передавать конфиденциальные данные по строке запроса.

[1] Хотя я должен отметить, что RFC заявляет, что браузер не должен отправлять рефереры из HTTPS в HTTP. Но это не значит, что плохая сторонняя панель инструментов браузера или внешнее изображение / флэш-память с сайта HTTPS не пропустят ее.

68 голосов
/ 27 ноября 2008

С точки зрения «анализировать сетевой пакет» запрос GET безопасен, так как браузер сначала устанавливает безопасное соединение, а затем отправляет запрос, содержащий параметры GET. Но URL-адреса GET будут храниться в истории / автозаполнении браузера пользователя, что не очень удобно для хранения, например. данные пароля. Конечно, это применимо только в том случае, если вы используете более широкое определение «веб-службы», которое может обращаться к службе из браузера, если вы обращаетесь к нему только из своего пользовательского приложения, это не должно быть проблемой.

Поэтому предпочтительнее использовать post хотя бы для диалогов с паролями. Кроме того, как указано в ссылке, Littlegeek опубликовал URL GET, более вероятно, будет записан в журналы вашего сервера.

33 голосов
/ 28 марта 2016

Да , строки вашего запроса будут зашифрованы.

Причина заключается в том, что строки запросов являются частью протокола HTTP, который является протоколом прикладного уровня, тогда как часть безопасности (SSL/TLS) происходит из транспортного уровня. Сначала устанавливается соединение SSL, а затем на сервер отправляются параметры запроса (принадлежащие протоколу http).

При установлении соединения SSL ваш клиент выполнит следующие шаги по порядку. Предположим, вы пытаетесь войти на сайт с именем example.com и хотите отправить свои учетные данные, используя параметры запроса. Ваша полная URL может выглядеть следующим образом.

(e.g https://example.com/login?username=alice&password=12345) 
  1. Ваш клиент (например, браузер / мобильное приложение) сначала разрешит ваше доменное имя (example.com) в IP адрес (124.21.12.31), используя запрос DNS. При запросе этой информации используется только информация, относящаяся к домену. т.е. будет использоваться только example.com.
  2. Теперь ваш клиент попытается подключиться к серверу с IP адресом 124.21.12.31 и попытается подключиться к порту 443 (SSL сервисный порт не по умолчанию http порт 80) .
  3. Теперь сервер на example.com отправит свои сертификаты вашему клиенту.
  4. Ваш клиент проверит сертификаты и начнет обмениваться общим секретным ключом для вашего сеанса.
  5. После успешного установления безопасного соединения, только параметры вашего запроса будут отправляться через безопасное соединение.

Следовательно, вы не будете предоставлять конфиденциальные данные. Однако отправка учетных данных через сеанс https с использованием этого метода - не лучший способ. Вы должны пойти по другому пути.

25 голосов
/ 27 ноября 2008

Да. Весь текст сеанса HTTPS защищен SSL. Это включает в себя запрос и заголовки. В этом отношении POST и GET будут абсолютно одинаковыми.

Что касается безопасности вашего метода, то без надлежащего осмотра нет реального способа сказать.

22 голосов
/ 27 ноября 2008

SSL сначала подключается к хосту, поэтому имя хоста и номер порта передаются в виде открытого текста. Когда хост отвечает и вызов успешно завершается, клиент зашифровывает запрос HTTP с помощью фактического URL-адреса (т. Е. Чего-либо после третьего слеша) и отправляет его на сервер.

Существует несколько способов взломать эту защиту.

Можно настроить прокси-сервер, чтобы он действовал как «человек посередине». По сути, браузер отправляет запрос на подключение к реальному серверу прокси. Если прокси-сервер настроен таким образом, он будет подключаться через SSL к реальному серверу, но браузер по-прежнему будет взаимодействовать с прокси-сервером. Поэтому, если злоумышленник может получить доступ к прокси-серверу, он может видеть все данные, проходящие через него, в виде открытого текста.

Ваши запросы также будут видны в истории браузера. У пользователей может возникнуть желание сделать закладку на сайте. У некоторых пользователей установлены инструменты синхронизации закладок, поэтому пароль может оказаться на сайте deli.ci.us или в другом месте.

Наконец, кто-то, возможно, взломал ваш компьютер и установил клавиатурный логгер или скребок для экрана (как это делают многие вирусы типа «Троянский конь»). Поскольку пароль виден непосредственно на экране (в отличие от «*» в диалоговом окне ввода пароля), это еще одна дыра в безопасности.

Вывод: когда дело доходит до безопасности, всегда полагайтесь на проторенный путь. Слишком много всего, о чем вы не знаете, о чем не подумаете и что сломает вам шею.

9 голосов
/ 27 ноября 2008

Да, пока никто не смотрит через плечо на монитор.

9 голосов
/ 27 ноября 2008

Я не согласен с утверждением о [...] утечке реферера HTTP (внешнее изображение на целевой странице может утечь пароль) in Ответ Slough .

HTTP 1.1 RFC явно заявляет :

Клиенты НЕ ДОЛЖНЫ включать Реферера поле заголовка в (небезопасном) HTTP запросить ссылку на страницу передается по безопасному протоколу.

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

8 голосов
/ 27 ноября 2008

Да, с того момента, как вы установили соединение HTTPS, все в безопасности. Строка запроса (GET) в виде POST отправляется по SSL.

0 голосов
/ 08 ноября 2012

Вы можете отправить пароль в виде хеш-параметра MD5 с добавлением соли. Сравните его на стороне сервера для аутентификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...