Когда я должен использовать метод GET или POST? Какая разница между ними? - PullRequest
213 голосов
/ 03 февраля 2009

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

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

Ответы [ 13 ]

233 голосов
/ 03 февраля 2009

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

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

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

74 голосов
/ 03 февраля 2009

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

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

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

37 голосов
/ 04 апреля 2011

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

Вы используете:

  • GET , когда вы хотите получить данные (GET DATA).
  • POST , когда вы хотите отправить данные (POST DATA).
19 голосов
/ 03 февраля 2009

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

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

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

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

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

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

17 голосов
/ 03 февраля 2009

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

15 голосов
/ 03 февраля 2009

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

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

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

13 голосов
/ 02 апреля 2014

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

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

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

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

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

8 голосов
/ 03 февраля 2009

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

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

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

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

6 голосов
/ 26 июня 2014

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

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

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

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

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

...