Допустимы ли проблемы безопасности при отправке пароля с помощью запроса GET по https?
у нас есть веб-страница, которая использует sapui5-framework для создания спа. Связь между браузером и сервером использует https. Взаимодействие для входа на страницу следующее:
- пользователь открывает веб-сайт, введя
https://myserver.com
в браузере - отображается диалог входа с двумя полями формы для unsername и password.
- после ввода
username
иpassword
и нажавlogin-button
- ajax-запрос отправляется с помощью
GET
к URL:https://myusername:myPassword@myserver.com/foo/bar/metadata
согласно моему пониманию, использование GET для отправки конфиденциальных данных никогда не является хорошей идеей. Но это ответ на HTTPS-это строка url secure говорит следующее
HTTPS Establishes an underlying SSL conenction before any HTTP data is
transferred. This ensures that all URL data (with the exception of
hostname, which is used to establish the connection) is carried solely
within this encrypted connection and is protected from
man-in-the-middle attacks in the same way that any HTTPS data is.
An в другом ответе в той же теме:
These fields [for example form field, query strings] are stripped off
of the URL when creating the routing information in the https packaging
process by the browser and are included in the encrypted data block.
The page data (form, text, and query string) are passed in the
encrypted block after the encryption methods are determined and the
handshake completes.
но кажется, что все еще могут быть проблемы безопасности с использованием get:
- URL хранится в журналах на сервере и в том же потоке
- утечка через историю браузера
это случай для URL-адресов, как?
https://myusername:myPassword@myserver.com/foo/bar/metadata
// or
https://myserver.com/?user=myUsername&pass=MyPasswort
дополнительные вопросы по этой теме:
- Is passsing получить переменные через ssl secure
- Is отправка пароля в json по https считается безопасным
- как безопасно отправлять пароли через GET / POST?
о безопасности.stackexchange-дополнительная информация:
но, на мой взгляд, несколько аспектов все еще не ответили
вопрос
на мой взгляд все действительные возражения против использования get. Это так; использование get для отправки паролей-плохая идея?
это варианты атаки, есть ли еще?
- история браузера
- журналы сервера (при условии, что url-адрес хранится в журналах незашифрованным или зашифрованным)
- referer информация (если это действительно так)
какие параметры атаки существуют при отправке конфиденциальных данных (пароля) через https с помощью получить?
спасибо
4 ответов
эти два подхода принципиально различны:
https://myusername:myPassword@myserver.com/foo/bar/metadata
https://myserver.com/?user=myUsername&pass=MyPasswort
myusername:myPassword@
- это "Информация О Пользователе" (эта форма фактически устарела в последнем URI RFC), тогда как ?user=myUsername&pass=MyPasswort
является частью запроса.
если вы посмотрите на этот пример из RFC 3986:
foo://example.com:8042/over/there?name=ferret#nose
\_/ \______________/\_________/ \_________/ \__/
| | | | |
scheme authority path query fragment
| _____________________|__
/ \ / \
urn:example:animal:ferret:nose
myusername:myPassword@
является частью авторитет. На практике используйте http (Basic) аутентификацию заголовки обычно используются для передачи этой информации. На стороне сервера заголовки обычно не регистрируются (и если это так, то не имеет значения, ввел ли клиент их в строку местоположения или через диалоговое окно ввода). В общем (хотя это зависит от реализации), браузеры не хранят его в строке расположения или, по крайней мере, удаляют пароль. Похоже, что Firefox сохраняет userinfo в истории браузера, а Chrome-нет (и IE на самом деле не поддержите их без обходного пути)
в противоположность ?user=myUsername&pass=MyPasswort
- это запрос, гораздо более неотъемлемой частью URI, и это отправить как HTTP запрос-URI. Это будет в истории браузера и логи сервера. Это также будет передано в referrer.
просто myusername:myPassword@
явно предназначен для передачи информации, которая потенциально чувствительна, и браузеры, как правило, предназначены для обработки этого должным образом, в то время как браузеры не могут угадать, какая часть запросов чувствительна, а какая нет: ожидайте утечки информации.
информация реферера также обычно не будет просачиваться третьим лицам, так как Referer
заголовок, поступающий со страницы HTTPS, обычно отправляется только с другим запросом по HTTPS на тот же хост. (Конечно, если вы использовали https://myserver.com/?user=myUsername&pass=MyPasswort
, это будет в журналах того же хоста, но вы не делаете это много стоит, так как он остается на том же сервере системный журнал.)
это указано в спецификация HTTP (раздел 15.1.3):
клиенты не должны включать поле заголовка Referer в (незащищенный) HTTP-запрос, если ссылающаяся страница была передана с защищенным протоколом.
хотя это просто "не должно", Internet Explorer, Chrome и Firefox, похоже, реализуют его таким образом. Применяется ли это к HTTPS-запросам от одного хоста к другому, зависит от браузер и его версия.
теперь можно переопределить это поведение, как описано в этот вопрос и этот проект спецификация, С помощью <meta>
заголовок, но вы не сделали бы этого на чувствительной странице, которая использует ?user=myUsername&pass=MyPasswort
в любом случае.
обратите внимание, что остальные спецификация HTTP (раздел 15.1.3) тоже актуальна:
авторы сервисов, которые используют протокол HTTP, не должны использовать GET основанные формы для представления конфиденциальных данных, поскольку это приведет к кодированию этих данных в URI запроса. Многие существующие серверы, прокси и агенты пользователей будут регистрировать URI запроса в том месте, где он может быть виден третьим лицам. Серверы могут использовать POST-based form submission вместо
используя ?user=myUsername&pass=MyPasswort
точно так же, как с помощью GET на основе формы и, в то время как проблема Referer может содержаться, проблемы, касающиеся журналов и истории остаются.
отправка любых конфиденциальных данных через GET опасна, даже если это HTTPS. Эти данные могут оказаться в лог-файлах на сервере и будут включены в заголовок Referer в ссылках или включены с других сторон. Они также будут сохранены в истории браузера, поэтому злоумышленник может попытаться угадать и проверить исходное содержимое ссылки с помощью атаки на историю.
кроме того, вам лучше задать такие вопросы в security.stackexchange.com.
предположим, что пользователь нажал кнопку и следующий запрос, сгенерированный браузером клиента.
https://www.site.com/?username=alice&password=b0b123!
HTTPS
первым делом первым. HTTPS не связан с этой темой. Потому что использование POST или GET не имеет значения с точки зрения злоумышленника. Злоумышленники могут легко захватить конфиденциальные данные из строки запроса или непосредственно отправить тело запроса, когда трафик HTTP. Поэтому он делает не имеет никакого значения.
Логи Сервера
мы знаем, что Apache, Nginx или другие службы регистрируют каждый HTTP-запрос в файл журнала. Что означает строку запроса ( ?имя=Алиса&пароль=b0b123! ) будет записываться в лог-файлы. Это может быть опасно, так как системный администратор может получить доступ к этим данным и получить все учетные данные пользователя. Также может произойти еще один случай, когда ваш сервер приложений компромисс. Я верю, что вы храните пароль хэшируется. Если вы используете мощный алгоритм хэширования, такой как SHA256, пароль вашего клиента будет более безопасным для хакеров. Но хакеры могут получить доступ к файлам журнала напрямую получить пароли в виде обычного текста с очень базовыми сценариями оболочки.
Referer Информация
мы предположили, что клиент открыл ссылку выше. Когда клиентский браузер получит html-контент и попытается его проанализировать, он увидит тег изображения. Эти изображения могут быть размещены вне вашего домена ( postimage или аналогичные сервисы или непосредственно домен, который находится под контролем хакера ) . Браузер делает HTTP-запрос, чтобы получить изображение. Но текущий url-адресhttps://www.site.com/?username=alice&password=b0b123! который будет referer информации!
Это означает, что Алиса и ее пароль будут переданы в другой домен и могут быть доступны непосредственно из веб-журналов. Это действительно важный вопрос безопасности.
эта тема напоминает мне о фиксации сеанса Факторы уязвимости. Пожалуйста, прочитайте следующую статью OWASP для почти такого же недостатка безопасности с сеансами. (https://www.owasp.org/index.php/Session_fixation) это стоит прочитать.
сообщество предоставило широкий взгляд на соображения, вышеизложенные позиции в отношении вопроса. Однако запросы GET, как правило, нуждаются в аутентификации. Как отмечалось выше, отправка имени пользователя / пароля как части URL-адреса никогда не является правильной, однако обычно это не так, как обычно обрабатывается информация аутентификации. Когда запрос на ресурс отправляется на сервер, сервер обычно отвечает заголовком 401 и Authentication в ответе против который клиент отправляет заголовок авторизации с информацией аутентификации (в базовой схеме). Теперь этот второй запрос от клиента может быть сообщением или запросом GET, ничто не мешает этому. Таким образом, как правило, речь идет не о типе запроса, а о способе передачи информации.
Refer http://en.wikipedia.org/wiki/Basic_access_authentication