Я создаю защищенный веб-интерфейс, который использует HTTPS; однако, если я разрешаю пользователям настраивать его (включая отправку пароля) с помощью строки запроса, это также будет безопасно или я должен заставить его выполнить через POST?
Безопасна ли строка запроса HTTPS?
Ответ 1
Да, это так. Но использование GET для конфиденциальных данных - это плохая идея по нескольким причинам:
- В основном утечка HTTP-реферера (внешнее изображение на целевой странице может пропустить пароль [1])
- Пароль будет храниться в журналах сервера (что явно плохо)
- История кэшей в браузерах
Поэтому, несмотря на то, что Querystring защищен, не рекомендуется передавать конфиденциальные данные по запросу.
[1] Хотя мне нужно отметить, что RFC заявляет, что браузер не должен отправлять рефереры из HTTPS в HTTP. Но это не означает, что плохая сторонняя панель инструментов браузера или внешнее изображение/флеш с сайта HTTPS не пропустит его.
Ответ 2
С точки зрения "нюхать сетевой пакет" запрос GET безопасен, так как браузер сначала установит безопасное соединение, а затем отправит запрос, содержащий параметры GET. Но GET url будет храниться в истории браузера пользователя/автозаполнения, что не является хорошим местом для хранения, например. данные в пароле. Конечно, это применимо только в том случае, если вы используете более широкое определение "Webservice", которое может обращаться к сервису из браузера, если вы обращаетесь к нему только из своего пользовательского приложения, это не должно быть проблемой.
Поэтому рекомендуется использовать пост, по крайней мере, для диалоговых окон с паролями. Также, как указано в ссылке littlegeek, отправленный URL-адрес GET, скорее всего, будет записан в журналы вашего сервера.
Ответ 3
Да, ваши строки запроса будут зашифрованы.
Причиной этого является то, что строки запросов являются частью протокола HTTP, который является протоколом прикладного уровня, в то время как часть безопасности (SSL/TLS) происходит от транспортного уровня. Сначала устанавливается соединение SSL, а затем параметры запроса (принадлежащие протоколу HTTP) отправляются на сервер.
При установке SSL-соединения ваш клиент выполнит следующие шаги по порядку. Предположим, вы пытаетесь войти на сайт с именем example.com и хотите отправить свои учетные данные, используя параметры запроса. Ваш полный URL может выглядеть следующим образом:
https://example.com/login?username=alice&password=12345)
- Ваш клиент (например, браузер/мобильное приложение) сначала разрешит ваше доменное имя
example.com
в IP-адрес(124.21.12.31)
используя запрос DNS. При запросе этой информации используется только информация, относящаяся к конкретному домену, т.example.com
Будет использоваться толькоexample.com
. - Теперь ваш клиент попытается подключиться к серверу с IP-адресом
124.21.12.31
и попытается подключиться к порту 443 (порт службы SSL не является портом HTTP по умолчанию 80). - Теперь сервер
example.com
отправит свои сертификаты вашему клиенту. - Ваш клиент проверит сертификаты и начнет обмениваться секретным ключом для вашего сеанса.
- После успешного установления безопасного соединения, только тогда параметры вашего запроса будут отправлены через безопасное соединение.
Поэтому вы не будете раскрывать конфиденциальные данные. Однако отправка учетных данных через сеанс HTTPS с использованием этого метода - не лучший способ. Вы должны пойти на другой подход.
Ответ 4
Да. Весь текст сеанса HTTPS обеспечивается SSL. Это включает в себя запрос и заголовки. В этом отношении POST и GET будут точно такими же.
Что касается безопасности вашего метода, нет реального способа сказать без надлежащего контроля.
Ответ 5
SSL сначала подключается к хосту, поэтому имя хоста и номер порта передаются как чистый текст. Когда хост отвечает и вызов преуспевает, клиент будет шифровать HTTP-запрос с фактическим URL (т.е. Что-нибудь после третьего косая черта) и отправить его на сервер.
Существует несколько способов разблокировать эту безопасность.
Можно настроить прокси-сервер как "человека посередине". По сути, браузер отправляет запрос на подключение к реальному серверу с прокси-сервером. Если прокси-сервер настроен таким образом, он будет подключаться через SSL к реальному серверу, но браузер все равно будет разговаривать с прокси-сервером. Поэтому, если злоумышленник может получить доступ к прокси-серверу, он может видеть все данные, которые проходят через него в ясном тексте.
Ваши запросы также будут отображаться в истории браузера. У пользователей может возникнуть соблазн добавить закладку на сайт. У некоторых пользователей установлены инструменты синхронизации закладок, поэтому пароль может оказаться на deli.ci.us или в другом месте.
Наконец, кто-то мог взломать ваш компьютер и установить регистратор клавиатуры или скребок экрана (и много вирусов типа Trojan Horse). Поскольку пароль отображается непосредственно на экране (в отличие от "*" в диалоговом окне пароля), это еще одно отверстие безопасности.
Заключение: когда дело доходит до безопасности, всегда полагайтесь на проторенный путь. Слишком много, что вы не знаете, не подумаете и что сломает вам шею.
Ответ 6
Я не согласен с утверждением о [...] утечке HTTP-реферера (внешнее изображение на целевой странице может привести к утечке пароля) в ответ на сообщение об уязвимости.
HTTP 1.1 RFC явно указывает:
Клиенты НЕ ДОЛЖНЫ включать ссылку поле заголовка в (незащищенном) HTTP-заголовке запросить, если ссылающаяся страница была передается с защищенным протоколом.
В любом случае, журналы сервера и история браузера являются более чем достаточными причинами, чтобы не помещать конфиденциальные данные в строку запроса.
Ответ 7
Да, пока никто не смотрит через плечо на монитор.
Ответ 8
Да, с момента установки HTTPS-соединение безопасно. Строка запроса (GET) как POST отправляется через SSL.
Ответ 9
Вы можете отправить пароль в качестве параметра MD5 с добавлением соли. Сравните его на стороне сервера для авторизации.