Безопасна ли строка запроса 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)
- Ваш клиент (например, браузер / мобильное приложение) сначала разрешит ваше доменное имя
(example.com)
дляIP
адрес(124.21.12.31)
используяDNS
запрос. При запросе этой информации используется только информация, относящаяся к домену. т.е. толькоexample.com
будет использоваться. - Теперь ваш клиент попытается подключиться к серверу с
IP
адрес124.21.12.31
и будет пытаться подключиться к порту443
(SSL
сервисный порт не по умолчаниюhttp
порт80
). - Теперь сервер на
example.com
отправит свои сертификаты вашему клиенту. - Ваш клиент проверит сертификаты и начнет обмениваться секретным ключом для вашего сеанса.
- После успешного установления безопасного соединения, только параметры вашего запроса будут отправлены через безопасное соединение.
Поэтому вы не будете раскрывать конфиденциальные данные. Однако отправка учетных данных через сеанс https с использованием этого метода - не лучший способ. Вы должны пойти на другой подход.
Да. Весь текст сеанса HTTPS защищен SSL. Это включает в себя запрос и заголовки. В этом отношении POST и GET будут абсолютно одинаковыми.
Что касается безопасности вашего метода, то без надлежащего осмотра нет реального способа сказать.
Сначала SSL подключается к хосту, поэтому имя хоста и номер порта передаются в виде открытого текста. Когда хост отвечает и вызов успешно выполняется, клиент зашифровывает HTTP-запрос фактическим URL-адресом (т. Е. После третьего слеша) и отправляет его на сервер.
Есть несколько способов сломать эту безопасность.
Можно настроить прокси, чтобы он действовал как "человек посередине". По сути, браузер отправляет запрос на подключение к реальному серверу прокси. Если прокси-сервер настроен таким образом, он будет подключаться через SSL к реальному серверу, но браузер по-прежнему будет взаимодействовать с прокси-сервером. Таким образом, если злоумышленник может получить доступ к прокси-серверу, он может видеть все данные, проходящие через него, в виде открытого текста.
Ваши запросы также будут видны в истории браузера. У пользователей может возникнуть желание сделать закладку на сайте. У некоторых пользователей установлены инструменты синхронизации закладок, поэтому пароль может оказаться на сайте deli.ci.us или в другом месте.
Наконец, кто-то, возможно, взломал ваш компьютер и установил регистратор клавиатуры или скребок для экрана (что делают многие вирусы типа "Троянский конь"). Поскольку пароль виден непосредственно на экране (в отличие от "*" в диалоговом окне ввода пароля), это еще одна дыра в безопасности.
Вывод: когда дело доходит до безопасности, всегда полагайтесь на проторенный путь. Слишком много всего, о чем вы не знаете, о чем не будете думать и что сломает вам шею.
Я не согласен с утверждением об [...] утечке реферера HTTP (внешнее изображение на целевой странице может утечь пароль) в ответе Слау.
RFC HTTP 1.1 явно заявляет:
Клиенты НЕ ДОЛЖНЫ включать поле заголовка Referer в (незащищенный) HTTP-запрос, если ссылающаяся страница была передана по безопасному протоколу.
В любом случае, журналы сервера и история браузера являются более чем достаточными причинами, чтобы не помещать конфиденциальные данные в строку запроса.
Да, с того момента, как вы установили HTTPS-соединение, все в безопасности. Строка запроса (GET) как POST отправляется по SSL.
Вы можете отправить пароль в виде хеш-параметра MD5 с добавлением соли. Сравните это на стороне сервера для аутентификации.