Когда я должен использовать метод GET или POST? Какая разница между ними?


249

Какая разница при использовании GETили POSTметод? Какой из них более безопасен? Каковы (не) преимущества каждого из них?

( аналогичный вопрос )


2
Get не имеет тела, поэтому на практике это означает, что вы ограничены парами имя -> значение в качестве структуры данных из-за отсутствия какого-либо формата кодировки строки запроса для более сложной структуры. Если вам нужно обрабатывать более сложные структуры данных в ваших запросах (например, массив, объект и т. Д.), Вам нужно использовать POST и, возможно, более продвинутые форматы (json / xml). Коротко говоря: не используйте GET, если это действительно не нужно (т. Е. URL / ресурс должен быть обнаружим).
— Мехай

Ответы:


263

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

Также обратите внимание, что PHP немного путает понятия. Запрос POST получает входные данные из строки запроса и через тело запроса. Запрос GET просто получает входные данные из строки запроса. Таким образом, запрос POST является расширенным набором запроса GET; Вы можете использовать $_GETв запросе POST, и он даже может иметь смысл иметь параметры с тем же именем в $_POSTи $_GETчто означают разные вещи.

Например, допустим, у вас есть форма для редактирования статьи. Идентификатор статьи может быть в строке запроса (и, следовательно, доступен через $_GET['id']), но допустим, что вы хотите изменить идентификатор статьи. Новый идентификатор может затем присутствовать в теле запроса ( $_POST['id']). Хорошо, возможно, это не лучший пример, но я надеюсь, что он иллюстрирует разницу между ними.


13
В разнице между GET и POST есть определенный аспект безопасности. Вредоносный сайт может прикрепить произвольный запрос GET, например, к тегу изображения, заставляя пользователей выполнять GET для другого сервера. Если этот GET похож на otherserver / deletemyaccount, тогда случаются плохие вещи.
— Фрэнк Швитерман

2
Я имел в виду, что содержимое $ _POST не скрыто от злоумышленников. Очевидно, есть аспекты безопасности для всего программирования.
— troelskn

1
Этот пост не отвечает полностью на вопрос, потому что он не упоминает о последствиях для безопасности. Верхняя часть хороша до тех пор, пока орфографическая ошибка «Pain English» заменена на «Обычный английский». Нижняя часть слишком сложна для подражания. В целом, намного лучше, чем мой пост. :-)
— Акрикос,

1
«Запрос POST получает входные данные из строки запроса и через тело запроса». ИМХО это неверно. Чтобы использовать любой ввод, вам нужно использовать $ _REQUEST. $ _POST не получает записи URL.
— Гуннар Бернштейн

1
@Frank Schwieterman Я знаю, что этот пост старый, но удалить мой аккаунт не идемпотентно и не следует использовать get.
— морозное

77

Когда пользователь вводит информацию в форме и нажимает кнопку Отправить, существует два способа отправки информации из браузера на сервер: в URL-адресе или в теле HTTP-запроса.

Метод GET, который использовался в предыдущем примере, добавляет пары имя / значение в URL. К сожалению, длина URL-адреса ограничена, поэтому этот метод работает только при наличии только нескольких параметров. URL-адрес может быть сокращен, если форма использует большое количество параметров или если параметры содержат большие объемы данных. Кроме того, параметры, передаваемые по URL-адресу, отображаются в поле адреса браузера и не являются лучшим местом для отображения пароля.

Альтернативой методу GET является метод POST. Этот метод упаковывает пары имя / значение внутри тела HTTP-запроса, что обеспечивает более чистый URL-адрес и не накладывает ограничений на размер выходных данных форм. Это также более безопасно.


1
Как это более "безопасно"?
— Джулиан Решке

4
потому что его сложнее изменить? Вы можете изменить GET в адресной строке, но это не так просто с POST.
— IAdapter,

8
Сервер не может доверять клиенту. Разработка вашего приложения на основе ложных предположений, далеко не безопасно.
— troelskn

OpenID также не сохранить, потому что он может быть сломан?
— IAdapter

1
Я считаю, что это самое четкое объяснение - разница в размещении отправленных данных. Спасибо.
— Greenoldman

37

Лучший ответ был первым.

Ты используешь:

  • Получить, когда вы хотите получить данные (GET DATA).
  • POST, когда вы хотите отправить данные (POST DATA).

2
Какой шаблон запроса / ответа используется, и вы хотите сделать и то, и другое? ;) Я бы предпочел использовать POST в большинстве случаев, когда мне нужно получить ответ.
— Дмитрий Павлов

8
Как правило, это правда. GETтакже вполне способен «отправлять» данные, поэтому не очень точный ответ.
— Патрик Хофман

23

Есть два распространенных значения «безопасности» при использовании GET. Поскольку данные отображаются в строке URL-адреса, возможно, кто-то, глядя через плечо на адресную строку / URL-адрес, может просмотреть что-то, к чему он не должен быть привязан, например, файл cookie сеанса, который потенциально может быть использован для захвата вашего сеанса. Имейте в виду, что у каждого есть телефон с камерой.

Другое значение безопасности связано GETс тем, что GETпеременные регистрируются в журнале доступа большинства веб-серверов как часть запрашиваемого URL-адреса. В зависимости от ситуации, нормативного климата и общей чувствительности данных это может вызвать опасения.

Некоторые клиенты / брандмауэры / системы IDS могут не одобрять GETзапросы, содержащие чрезмерное количество данных, и поэтому могут давать ненадежные результаты.

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

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

Другие уже проделали хорошую работу по освещению семантических различий и части «когда» в этом вопросе.


17

Я использую GET при извлечении информации из URL и POST при отправке информации по URL.


1
но вы также можете использовать GET для отправки. Разница заключается в формате (в URL (GET) или в запросе (POST)).
— Эриком

Если конечная точка принимает файл и возвращает строку из файла (без создания или изменения данных или базы данных), то должна ли конечная точка быть GET или POST?
— переменная

17

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

Используйте GET, если вы хотите, чтобы люди могли добавлять вашу страницу в закладки, потому что все данные включены в закладку.

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


Если конечная точка принимает файл и возвращает строку из файла (без создания или изменения данных или базы данных), то должна ли конечная точка быть GET или POST?
— переменная

@variable POST. В этом случае, главным образом потому, что POST создан для обработки загрузки файлов, а стандартный GET - нет. Вам придется отправлять файл каждый раз при загрузке страницы, поэтому имеет смысл просто использовать стандартный файл POST вместо файла GET +, который нарушил бы ожидание GET о том, что URL должен давать более или менее одинаковые результаты каждый раз.
— Грант

14

Этот документ W3C объясняет использование HTTP GET и POST.

Я думаю, что это авторитетный источник.

Резюме (раздел 1.3 документа):

  • Используйте GET, если взаимодействие больше похоже на вопрос (т. Е. Это безопасная операция, такая как запрос, операция чтения или поиск).
  • Используйте POST, если:
    • Взаимодействие больше похоже на заказ, или
    • Взаимодействие изменяет состояние ресурса так, как его воспринимает пользователь (например, подписка на услугу), или
    • Пользователь будет нести ответственность за результаты взаимодействия.

9
Я думаю, что это может быть обобщено следующим образом: GET, когда состояние сервера не изменилось, POST, когда оно есть.
— Ямча

10

Методы Get и Post не имеют ничего общего с используемой вами серверной технологией, они работают одинаково в php, asp.net или ruby. GET и POST являются частью протокола HTTP. Как отмечалось, POST более безопасен. POST-формы также не кэшируются браузером. POST также используется для передачи больших объемов данных.


8

Причина использования POST при внесении изменений в данные:

  • Веб-ускоритель, такой как Google Web Accelerator, будет щелкать все (GET) ссылки на странице и кэшировать их. Это очень плохо, если ссылки вносят изменения в вещи.
  • Браузер кэширует GET-запросы, поэтому, даже если пользователь щелкает ссылку, он не может отправить запрос на сервер для выполнения изменения.
  • Чтобы защитить ваш сайт / приложение от CSRF, вы должны использовать POST. Чтобы полностью обезопасить свое приложение, вы также должны сгенерировать уникальный идентификатор на сервере и отправить его вместе с запросом.

Кроме того, не помещайте конфиденциальную информацию в строку запроса (только для GET), поскольку она отображается в адресной строке, закладках и журналах сервера.

Надеюсь, это объясняет, почему люди говорят, что POST является «безопасным». Если вы передаете конфиденциальные данные, вы должны использовать SSL.


8

GETи POSTHTTP-методы, которые могут достичь аналогичных целей

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

Никогда не используйте GETпри отправке паролей, кредитных карт или другой конфиденциальной информации !, данные видны всем в URL, могут быть кэшированы данные. GETбезвреден, когда мы перезагружаемся или перезваниваем, кнопка будет отмечена как книга, параметры остаются в истории браузера, разрешены только символы ASCII.

POSTможет включать в себя все, что угодно, например, хранение или обновление данных, или заказ продукта, или отправка электронной почты. POSTУ метода есть тело.

POSTметод защищен для передачи конфиденциальной и конфиденциальной информации на сервер, он не будет виден в параметрах запроса в URL и параметры не сохраняются в истории браузера. Нет ограничений на длину данных. Когда мы перезагружаемся, браузер должен предупредить пользователя о том, что данные собираются быть повторно отправленными. POSTметод не может быть добавлен в закладки


3
  1. Метод GET используется для отправки менее конфиденциальных данных, тогда как метод POST используется для отправки конфиденциальных данных.
  2. Используя метод POST, вы можете отправить большой объем данных по сравнению с методом GET.
  3. Данные, отправленные методом GET, видны в строке заголовка браузера, тогда как данные, отправленные методом POST, невидимы.

0

Используйте метод GET, если вы хотите получить ресурсы из URL. Вы всегда можете увидеть последнюю страницу, если нажмете кнопку «Назад» в своем браузере, и она может быть добавлена ​​в закладки, поэтому она не так безопасна, как метод POST.

Используйте метод POST, если вы хотите «отправить» что-то на URL. Например, вы хотите создать учетную запись Google и вам может потребоваться заполнить всю подробную информацию, а затем нажать кнопку «Отправить» (здесь вызывается метод POST) после успешной отправки и попытаться нажать кнопку «Назад» в своем браузере. , вы получите ошибку или новую пустую форму вместо последней страницы с заполненной формой.


-10

GETМетод:

  • Используется только для отправки 256 символов даты

  • При использовании этого метода информацию можно увидеть в браузере

  • Это метод по умолчанию, используемый формами

  • Это не так безопасно.


POSTМетод:

  • Используется для отправки неограниченных данных.

  • При использовании этого метода информация не отображается в браузере.

  • Вы можете явно упомянуть POSTметод

  • Это более надежно, чем GETметод

  • Это обеспечивает более продвинутые функции


«Используется только для отправки 256-символьной даты» - неправда. «При использовании этого метода информацию можно увидеть в браузере» - данные публикации также видны в браузерах, просто это не так очевидно. «Предоставляет более продвинутые функции» - например?
— Квентин

Это не очень полезный ответ. Неправильная информация, такая как «она не так защищена» и «предоставляет более продвинутые функции», и другие вещи, упомянутые Квентином.
— Эндрю Барбер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.