HTTP Методы: GET vs. POST
Протокол HTTP предназначен для обеспечения связи между клиентами и серверами.
HTTP работает как протокол запроса-ответа между клиентом и сервером.
Веб-обозреватель может быть клиентом, а приложение на компьютере, на котором размещается веб-узел, может быть сервером.
Пример: клиент (обозреватель) отправляет HTTP-запрос на сервер; Затем сервер возвращает ответ клиенту. Ответ содержит сведения о состоянии запроса, а также может содержать запрошенное содержимое.
Два метода HTTP-запроса: Get и POST
Два часто используемых метода запроса-ответа между клиентом и сервером: Get и POST.
- GET — Запрашивает данные из указанного ресурса
- POST — Отправка данных для обработки в указанный ресурс
Метод Get
Обратите внимание, что строка запроса (пары «имя-значение») отправляется в URL-адрес запроса GET:
Некоторые другие заметки о запросах GET:
- GET запросы могут кэшироваться
- GET запросы остаются в истории браузера
- GET запросы могут быть закладками
- GET запросы никогда не должны использоваться при работе с конфиденциальными данными
- GET запросы имеют ограничения по длине
- GET запросы должны использоваться только для извлечения данных
Метод POST
Обратите внимание, что строка запроса (пары «имя-значение») отправляется в теле HTTP-сообщения запроса POST:
Методы HTTP: GET vs. POST
Два наиболее часто используемые методы HTTP являются: GET и POST.
Что такое HTTP?
Протокол передачи гипертекста (HTTP) предназначена для обеспечения связи между клиентами и серверами.
HTTP работает в качестве протокола запроса-ответа между клиентом и сервером.
Веб-браузер может быть клиентом, а приложение на компьютере, на котором размещен веб-сайт может быть сервером.
Пример: клиент (браузер) подает запрос HTTP на сервер; то сервер возвращает ответ клиенту. Ответ содержит информацию о состоянии запроса и может также содержать запрошенное содержимое.
Два HTTP методы запроса: GET и POST
Два часто используемые методы для запроса-ответа между клиентом и сервером: GET и POST.
- GET — запрашивает данные из указанного ресурса
- POST — Отправляет данные, подлежащие обработке для указанного ресурса
Метод GET
Обратите внимание , что строка запроса (пары имя / значение) передается в URL запроса GET:
Некоторые другие заметки о запросах GET:
- GET запросы могут кэшироваться
- GET запросы остаются в истории браузера
- GET запросы могут быть закладкой
- не получать запросы не должны использоваться при работе с конфиденциальными данными
- GET запросы имеют ограничения длины
- GET запросы должны быть использованы только для получения данных
Метод POST
Обратите внимание , что строка запроса (пары имя / значение) передается в теле HTTP—сообщение запроса POST:
Является ли GET или POST более безопасным, чем другой?
При сравнении HTTP GET с HTTP POST, каковы различия с точки зрения безопасности? Является ли один из вариантов более безопасным, чем другой? Если да, то почему?
Я понимаю, что POST не раскрывает информацию об URL-адресе, но есть ли в этом реальная ценность или это просто безопасность через неясность? Есть ли причина, по которой я должен предпочесть POST, когда проблема безопасности является проблемой?
Edit:
Через HTTPS данные POST кодируются, но могут ли URL-адреса быть обнюханы сторонним лицом? Кроме того, я имею дело с JSP; при использовании JSP или аналогичной структуры было бы справедливым сказать, что лучше всего избегать размещения конфиденциальных данных в POST или GET в целом и с использованием кода на стороне сервера для обработки конфиденциальной информации вместо этого?
25 ответов
Что касается безопасности, они по своей сути одинаковы. Хотя верно, что POST не предоставляет информацию через URL-адрес, он предоставляет столько же информации, сколько GET в фактической сетевой связи между клиентом и сервером. Если вам нужно передать конфиденциальную информацию, ваша первая линия защиты будет передавать ее с использованием Secure HTTP.
GET или запросы на строковые сообщения действительно хороши для информации, необходимой для закладок определенного элемента или для помощи в оптимизации и индексировании поисковых систем.
POST хорош для стандартных форм, используемых для подачи одноразовых данных. Я бы не использовал GET для публикации фактических форм, если, возможно, в форме поиска, где вы хотите разрешить пользователю сохранять запрос в закладке или что-то в этом направлении.
Запрос GET не менее безопасен, чем запрос POST. Ни одна из них не предлагает истинную «безопасность» сама по себе; использование POST-запросов не будет волшебным образом сделать ваш сайт защищенным от вредоносных атак заметной суммой. Однако использование запросов GET может сделать защищенное приложение безопасным.
Мантра, которую вы «не должны использовать GET-запросы для внесения изменений», по-прежнему очень важна, но это мало связано с вредоносным поведением. Формы регистрации наиболее чувствительны к отправке с использованием неправильного типа запроса.
Поиск пауков и веб-ускорителей
Это настоящая причина использования запросов POST для изменения данных. Поисковые пауки будут следить за каждой ссылкой на вашем сайте, но не будут отправлять случайные формы, которые они находят.
Веб-ускорители хуже, чем поисковые пауки, потому что они запускаются на машине клиентов, а «click» — все ссылки в контексте зарегистрированного пользователя. Таким образом, приложение, которое использует запрос GET для удаления материала, даже если оно требует администратора, с радостью будет подчиняться заказам веб-ускорителя (не вредоносного!) И удалить все, что он видит.
Конфликтная атака заместителя
Единственный сценарий, в котором POST немного менее восприимчив, заключается в том, что многие сайты, которые находятся под контролем злоумышленников (например, сторонний форум), позволяют встраивать произвольные изображения (позволяя злоумышленнику вводить произвольный запрос GET), но предотвращать все способы ввода произвольного запроса POST, будь то автоматические или ручные.
Можно утверждать, что веб-ускорители являются примером запутанной атаки заместителей, но это только вопрос определения. Во всяком случае, злонамеренный злоумышленник не имеет никакого контроля над этим, поэтому его вряд ли атакует, даже если депутат путается.
Протоколы прокси
Прокси-серверы, скорее всего, будут записывать GET-URL в полном объеме, не снимая строку запроса. Параметры запроса POST обычно не регистрируются. Файлы cookie вряд ли будут зарегистрированы в любом случае. (пример)
Это очень слабый аргумент в пользу POST. Во-первых, незашифрованный трафик может регистрироваться полностью; у вредоносного прокси-сервера уже есть все, что ему нужно. Во-вторых, параметры запроса ограничены для злоумышленника: им действительно нужны файлы cookie, поэтому, если единственное, что у них есть, это протоколы прокси-сервера, они вряд ли смогут атаковать либо GET, либо POST-URL.
Существует одно исключение для запросов на вход: они, как правило, содержат пароль пользователей. Сохранение этого в журнале прокси открывает вектор атаки, отсутствующий в случае POST. Тем не менее, вход через простой HTTP по своей сути небезопасен.
Кэш прокси
Кэширующие прокси-серверы могут сохранять ответы GET, но не ответы POST. Сказав это, ответы GET могут быть сделаны не кэшируемыми с меньшими усилиями, чем преобразование URL-адреса в обработчик POST.
HTTP «Referer»
Если пользователь должен был перейти на сторонний веб-сайт со страницы, поданной в ответ на запрос GET, этот сторонний веб-сайт получит все параметры запроса GET.
Принадлежит к категории «показывает параметры запроса третьей стороне», чья тяжесть зависит от того, что присутствует в этих параметрах. Запросы POST естественно невосприимчивы к этому, однако для использования запроса GET хакеру необходимо будет вставить ссылку на свой веб-сайт в ответ сервера.
История браузера
Это очень похоже на аргумент «proxy logs»: запросы GET хранятся в истории браузера вместе с их параметрами. Злоумышленник может легко получить их, если у них есть физический доступ к машине.
Действие обновления браузера
Браузер повторит запрос GET, как только пользователь нажмет «обновить». Это может произойти при восстановлении вкладок после завершения работы. Таким образом, любое действие (например, оплата) будет повторяться без предупреждения.
Браузер не будет повторять запрос POST без предупреждения.
Это хорошая причина использовать только POST-запросы для изменения данных, но не имеет никакого отношения к вредоносному поведению и, следовательно, к безопасности.
Итак, что мне делать?
- Используйте только POST-запросы для изменения данных, в основном по причинам, не связанным с безопасностью.
- Использовать только запросы POST для форм входа; в противном случае вводят векторы атак.
- Если ваш сайт выполняет деликатные операции, вам действительно нужен кто-то, кто знает, что они делают, потому что это не может быть рассмотрено в одном ответе. Вам нужно использовать HTTPS, HSTS, CSP, уменьшить SQL-инъекцию, script injection (XSS), CSRF, и gazillion других вещей, которые могут быть специфическими для вашей платформы (например, уязвимость массового присвоения в различных рамках: ASP.NET MVC, Ruby on Rails и т.д.). Нет ни единой вещи, которая будет делать разницу между «безопасными» (не эксплуатируемыми) и «небезопасными».
За HTTPS данные POST закодированы, но могут ли URL-адреса быть обнюханы сторонней стороной?
Нет, они не могут понюхать. Но URL-адреса будут сохранены в истории браузера.
Можно ли сказать, что лучшая практика заключается в том, чтобы избежать возможности размещения конфиденциальных данных в POST или GET в целом и с использованием кода на стороне сервера для обработки конфиденциальной информации?
Зависит от того, насколько он чувствителен, или, точнее, каким образом. Очевидно, клиент увидит это. Любой, у кого есть физический доступ к компьютеру клиентов, увидит это. Клиент может обмануть его при отправке его обратно вам. Если это имеет значение, то да, сохраняйте конфиденциальные данные на сервере и не отпускайте их.
What is the difference between a HTTP-Get and HTTP-POST and why is HTTP-POST weaker in terms of security
Can anyone explain the difference between a HTTP-GET and HTTP-POST? And why do people say that a HTTP-POST is weaker in terms of security?
5 Answers 5
In an HTTP GET request, key/value pairs are specified in the URL:
In an HTTP POST request, key/value pairs are sent as part of the HTTP request after the headers. For example:
It’s hard to really describe one as being more or less secure than the other, but HTTP POST data is not visible in the URL, and when submitting data to a website, an HTTP POST can usually only be performed as a result of user interaction (for example clicking on a «Submit» button).
This means a user can’t be tricked into visiting a URL like http://server/update_profile?name=I_suck and sensitive data is not exposed in the URL.
You can also use nonces and other anti-forgery tokens with html forms (which use POST) to prevent other forms of cross-site request forgeries.
In general, POST should be used for requests that potentially modify state on the server, and GET should be used for read-only operations.