В чем разница между HTTP-Get и HTTP-POST и почему HTTP-POST слабее с точки зрения безопасности - PullRequest
50 голосов
/ 17 января 2010

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

Ответы [ 5 ]

71 голосов
/ 17 января 2010

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

<a href="http://server/something?value1=foo&value2=bar" rel="noreferrer">http://server/something?value1=foo&value2=bar</a>.

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

 POST /something HTTP/1.1
 Host: server
 Content-Length: 21
 Content-Type: application/x-www-form-urlencoded

 value1=foo&value2=bar

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

Это означает, что пользователь не может быть обманут в посещении URL-адреса, подобного <a href="http://server/update_profile?name=I_suck" rel="noreferrer">http://server/update_profile?name=I_suck</a>, и конфиденциальные данные не отображаются в URL-адресе.

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

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

61 голосов
/ 17 января 2010

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

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

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

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

31 голосов
/ 10 апреля 2014

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

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

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

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

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

16 голосов
/ 17 января 2010

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

9 голосов
/ 17 января 2010

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

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

...