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

249

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

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

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

Ответы:

263

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

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

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

troelskn
источник
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-адрес и не накладывает ограничений на размер выходных данных форм. Это также более безопасно.

IAdapter
источник
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, если:
    • Взаимодействие больше похоже на заказ, или
    • Взаимодействие изменяет состояние ресурса так, как его воспринимает пользователь (например, подписка на услугу), или
    • Пользователь будет нести ответственность за результаты взаимодействия.
Chus
источник
9
Я думаю, что это может быть обобщено следующим образом: GET, когда состояние сервера не изменилось, POST, когда оно есть.
Ямча
10

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

sarsnake
источник
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метод не может быть добавлен в закладки

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

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

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

RobotCharlie
источник
-10

GETМетод:

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

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

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

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


POSTМетод:

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

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

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

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

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

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