Безопасна ли строка запроса HTTPS?

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

9 ответов

Решение

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

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

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

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

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

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

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

Причина в том, что строки запроса являются частью 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 с использованием этого метода - не лучший способ. Вы должны пойти на другой подход.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам