В чем разница между HTTP-Get и HTTP-POST и почему HTTP-POST слабее с точки зрения безопасности

Может ли кто-нибудь объяснить разницу между HTTP-GET и HTTP-POST? И почему люди говорят, что HTTP-POST слабее с точки зрения безопасности?

В запросе HTTP GET пары ключ / значение указываются в URL-адресе:

http://server/something?value1=foo&value2=bar .

В запросе HTTP POST пары ключ / значение отправляются как часть HTTP-запроса после заголовков. Например:

  POST / что-то HTTP / 1.1
  Хост: сервер
  Контент-длина: 21
  Content-Type: application / x-www-form-urlencoded

  значение1 = Foo & значение2 = бар

Трудно описать один как более безопасный, чем другой, но HTTP POST-данные не отображаются в URL-адресе, а при отправке данных на веб-сайт HTTP POST обычно может выполняться только в результате взаимодействия с пользователем ( например, нажав кнопку «Отправить»).

Это означает, что пользователь не может быть обманут при посещении URL-адреса, например http://server/update_profile?name=I_suck а конфиденциальные данные не http://server/update_profile?name=I_suck в URL-адресе.

Вы также можете использовать nonces и другие антиблокировочные маркеры с html-формами (которые используют POST) для предотвращения других форм подделок для запросов на межсайтовый запрос.

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

Спецификация HTTP отличает POST и GET с точки зрения их намерения:

GET является idempotent: он предназначен для получения ресурса, не изменяя ничего на сервере. Как следствие, должно быть совершенно безопасно повторно отправить запрос GET.

POST не является: он предназначен для обновления информации на сервере. Поэтому нельзя предполагать, что можно повторно отправить запрос, поэтому большинство браузеров запрашивают подтверждение при нажатии обновления в запросе POST.

Что касается безопасности, то никакой разницы. Возможно, POST более неясен, но это совсем другое дело. Безопасность необходимо добавить на другой уровень, например SSL.

Некоторые заметки о запросах GET:

  1. Запросы GET можно кэшировать
  2. Запросы GET остаются в истории браузера
  3. Запросы GET можно добавить в закладки
  4. Запросы GET никогда не должны использоваться при работе с конфиденциальными данными
  5. Запросы GET имеют ограничения по длине
  6. Запросы GET должны использоваться только для извлечения данных

Некоторые примечания по запросам POST:

  1. Запросы POST никогда не кэшируются
  2. Запросы POST не сохраняются в истории браузера
  3. Запросы POST не могут быть отмечены закладкой
  4. Запросы POST не имеют ограничений на длину данных

(Источник: W3 Schools)

Я бы не назвал POST более или менее безопасным, чем GET. По общему признанию, параметры отображаются как часть URL-адреса при использовании GET, поэтому любые конфиденциальные данные будут немедленно видны пользователю. Тем не менее, тривиально просматривать и даже изменять любую часть HTTP-запроса, поэтому просто потому, что POST не передает данные через URL-адрес, который все еще можно легко прочитать. Если вы не используете HTTPS, GET и POST будут передавать данные в легкодоступной форме.

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

Запросы GET могут быть легко отклонены (см. « Подделка запросов на межсайтовый запрос» ), просто поместив изображение на страницу, в то время как запросы POST не так просто (это также является причиной, по которой вы должны разрешать разрешенные POST-запросы).

  • Разрешен ли объект сущности для запроса HTTP DELETE?
  • Передайте массив целых чисел в ASP.NET Web API?
  • Как установить Json.Net в качестве сериализатора по умолчанию для службы WCF REST
  • REST с полной привязкой данных Spring и Jackson
  • Как кодировать значения параметров URI?
  • Сделайте ASP.NET конвертер WCF в JSON, опустив tags «Key» и «Value»
  • Код ответа REST для недопустимых данных
  • JAX-RS / Джерси, как настроить обработку ошибок?
  • Как успешно отправить сообщение с помощью нового API GEST REST?
  • RESTful для Android, iOS ...?
  • Операции без CRUD в службе RESTful
  • Давайте будем гением компьютера.