Когда я должен использовать метод GET или POST? Какая разница между ними?
Какая разница при использовании GET
или же POST
метод? Какой из них более безопасен? Каковы (не) преимущества каждого из них?
18 ответов
Это не вопрос безопасности. Протокол HTTP определяет запросы типа GET как идемпотентные, в то время как POST могут иметь побочные эффекты. На простом английском языке это означает, что GET используется для просмотра чего-либо без изменения, а POST - для изменения чего-либо. Например, страница поиска должна использовать GET, а форма, которая изменяет ваш пароль, должна использовать POST.
Также обратите внимание, что PHP немного путает понятия. Запрос POST получает входные данные из строки запроса и через тело запроса. GET-запрос просто получает входные данные из строки запроса. Таким образом, запрос POST является расширенным набором запроса GET; ты можешь использовать $_GET
в запросе POST, и это может даже иметь смысл иметь параметры с тем же именем в $_POST
а также $_GET
это означает разные вещи.
Например, допустим, у вас есть форма для редактирования статьи. Идентификатор статьи может быть в строке запроса (и, таким образом, доступен через $_GET['id']
), но допустим, что вы хотите изменить идентификатор статьи. Новый идентификатор может затем присутствовать в теле запроса ($_POST['id']
). Хорошо, возможно, это не лучший пример, но я надеюсь, что он иллюстрирует разницу между ними.
Когда пользователь вводит информацию в форму и нажимает кнопку Отправить, существует два способа отправки информации из браузера на сервер: в URL-адресе или в теле HTTP-запроса.
Метод GET, который использовался в предыдущем примере, добавляет пары имя / значение в URL. К сожалению, длина URL-адреса ограничена, поэтому этот метод работает только при наличии только нескольких параметров. URL-адрес может быть усечен, если форма использует большое количество параметров или если параметры содержат большие объемы данных. Кроме того, параметры, передаваемые по URL-адресу, отображаются в поле адреса браузера и не являются наилучшим местом для отображения пароля.
Альтернативой методу GET является метод POST. Этот метод упаковывает пары имя / значение внутри тела HTTP-запроса, что обеспечивает более чистый URL-адрес и не накладывает ограничений на размер выходных данных форм. Это также более безопасно.
Лучший ответ был первым.
Ты используешь:
- GET, когда вы хотите получить данные (GET DATA).
- POST, когда вы хотите отправить данные (POST DATA).
Есть два распространенных значения "безопасности" при использовании GET. Поскольку данные отображаются в строке URL-адреса, возможно, кто-то, глядя через плечо на адресную строку /URL-адрес, может просмотреть что-то, к чему он не должен быть привязан, например, файл cookie сеанса, который потенциально может быть использован для захвата вашего сеанса. Имейте в виду, что у каждого есть телефон с камерой.
Другое значение безопасности GET связано с регистрацией переменных GET на большинстве веб-серверов, которые обращаются к журналу доступа как часть запрашивающего URL. В зависимости от ситуации, нормативного климата и общей чувствительности данных это может вызвать опасения.
Некоторые клиенты / брандмауэры / системы IDS могут не одобрять запросы GET, содержащие чрезмерное количество данных, и поэтому могут давать ненадежные результаты.
POST поддерживает расширенные функциональные возможности, такие как поддержка двоичного ввода из нескольких частей, используемого для загрузки файлов на веб-серверы.
POST требует заголовок длины содержимого, который может увеличить сложность реализации клиента для конкретного приложения, так как размер передаваемых данных должен быть известен заранее, чтобы клиентский запрос не формировался в инкрементном инкрементном режиме за один проход. Возможно, небольшая проблема для тех, кто хочет злоупотреблять HTTP, используя его как транспорт RPC.
Другие уже проделали хорошую работу по освещению семантических различий и части "когда" в этом вопросе.
С w3schools.com вот ключевые моменты запроса GET
- GET-запросы могут быть кэшированы
- GET запросы остаются в истории браузера
- GET запросы могут быть добавлены в закладки
- Запросы GET никогда не должны использоваться при работе с конфиденциальными данными.
- GET-запросы имеют ограничения по длине
- GET-запросы должны использоваться только для получения данных
и вот ключевые моменты POST-запроса
- POST-запросы никогда не кэшируются
- POST-запросы не сохраняются в истории браузера
- POST-запросы не могут быть добавлены в закладки
- POST-запросы не имеют ограничений по длине данных
Вы должны использовать POST, если имеется много данных или что-то вроде конфиденциальной информации (для действительно важных вещей также требуется безопасное соединение).
Используйте GET, если вы хотите, чтобы люди могли добавлять вашу страницу в закладки, потому что все данные включены в закладку.
Просто будьте осторожны с людьми, нажимающими REFRESH методом GET, потому что данные будут отправляться снова каждый раз без предупреждения пользователя (POST иногда предупреждает пользователя о повторной отправке данных).
Я использую GET, когда извлекаю информацию из URL, и POST, когда отправляю информацию в URL.
Этот документ W3C объясняет использование HTTP GET и POST.
Я думаю, что это авторитетный источник.
Краткое содержание (раздел 1.3 документа):
- Используйте GET, если взаимодействие больше похоже на вопрос (т. Е. Это безопасная операция, такая как запрос, операция чтения или поиск).
- Используйте POST, если:
- Взаимодействие больше похоже на заказ, или
- Взаимодействие изменяет состояние ресурса так, как его воспринимает пользователь (например, подписка на услугу), или
- Пользователь будет нести ответственность за результаты взаимодействия.
Методы Get и Post не имеют ничего общего с используемой вами серверной технологией, они работают одинаково в php, asp.net или ruby. GET и POST являются частью протокола HTTP. Как отмечалось, POST более безопасен. POST-формы также не кэшируются браузером. POST также используется для передачи больших объемов данных.
Причина использования POST при внесении изменений в данные:
- Веб-ускоритель, такой как Google Web Accelerator, будет щелкать все (GET) ссылки на странице и кэшировать их. Это очень плохо, если ссылки вносят изменения в вещи.
- Браузер кэширует GET-запросы, поэтому, даже если пользователь щелкает ссылку, он не может отправить запрос на сервер для выполнения изменения.
- Чтобы защитить ваш сайт / приложение от CSRF, вы должны использовать POST. Чтобы полностью защитить ваше приложение, вы должны также сгенерировать уникальный идентификатор на сервере и отправить его вместе с запросом.
Кроме того, не помещайте конфиденциальную информацию в строку запроса (только для GET), поскольку она отображается в адресной строке, закладках и журналах сервера.
Надеюсь, это объясняет, почему люди говорят, что POST является "безопасным". Если вы передаете конфиденциальные данные, вы должны использовать SSL.
GET
а также POST
методы HTTP, которые могут достичь аналогичных целей
GET
в основном только для получения (извлечения) данных, А GET
не должно иметь тела, поэтому, кроме файлов cookie, единственное место для передачи информации - URL-адрес, а длина URL-адресов ограничена, GET
менее безопасен по сравнению с POST
потому что отправленные данные являются частью URL
Никогда не используйте GET
при отправке паролей, кредитной карты или другой конфиденциальной информации!, данные видны всем в URL, могут быть кэшированы данные. GET
безвреден, когда мы перезагружаемся или перезваниваем, кнопка будет отмечена как книга, параметры остаются в истории браузера, разрешены только символы ASCII.
POST
может включать в себя все, что угодно, например, хранение или обновление данных, или заказ продукта, или отправка электронной почты. POST
У метода есть тело.
POST
метод защищен для передачи конфиденциальной и конфиденциальной информации на сервер, он не будет виден в параметрах запроса в URL, а параметры не сохраняются в истории браузера. Нет ограничений на длину данных. Когда мы перезагружаемся, браузер должен предупредить пользователя о том, что данные будут повторно отправлены. POST
метод не может быть добавлен в закладки
Все или, возможно, большинство ответов на этот вопрос и на другие вопросы по SO, относящиеся кGET
а также POST
заблуждаются. Они технически правильны и правильно объясняют стандарты, но на практике все совсем иначе. Позволь мне объяснить:
GET
считается идемпотентным, но это не обязательно. Вы можете передавать параметры вGET
в серверный сценарий, который вносит постоянные изменения в данные. Наоборот,POST
считается не идемпотентным, но вы можетеPOST
в сценарий, который не вносит изменений в сервер. Так что это ложная дихотомия, не имеющая отношения к практике.
Далее, было бы ошибкой сказать, что GET
не может ничего повредить при перезагрузке - конечно, может, если вызываемый им скрипт и параметры, которые он передает, вносят постоянные изменения (например, удаление данных для примеров). И так можетPOST
!
Теперь мы знаем, что POST
является (намного) более безопасным, потому что он не раскрывает передаваемые параметры и не кэшируется. Кроме того, вы можете передать больше данных, и выGET
чистый, не сбивающий с толку URL. И делает все, чтоGET
сможет сделать. Так просто лучше. По крайней мере, в производстве.
Итак, на практике, когда следует использовать GET
vs. POST
? я используюGET
во время разработки, чтобы я мог видеть и настраивать параметры, которые я передаю. Я использую его, чтобы быстро попробовать разные значения (например, для проверки условий) или даже разные параметры. Я могу сделать это, не создавая форму и не изменяя ее, если мне нужен другой набор параметров. Я просто редактирую URL-адрес в своем браузере по мере необходимости.
Когда разработка завершена или, по крайней мере, стабильна, я переключаю все на POST
.
Если вы можете придумать какую-либо техническую причину, по которой это неверно, я был бы очень рад узнать.
- Метод GET используется для отправки менее конфиденциальных данных, тогда как метод POST используется для отправки конфиденциальных данных.
- Используя метод POST, вы можете отправить большой объем данных по сравнению с методом GET.
- Данные, отправленные методом GET, видны в строке заголовка браузера, тогда как данные, отправленные методом POST, невидимы.
Используйте метод GET, если вы хотите получить ресурсы из URL. Вы всегда можете увидеть последнюю страницу, если нажмете кнопку "Назад" в своем браузере, и она может быть добавлена в закладки, поэтому она не так безопасна, как метод POST.
Используйте метод POST, если вы хотите "отправить" что-то на URL. Например, вы хотите создать учетную запись Google и вам может потребоваться заполнить всю подробную информацию, а затем нажать кнопку "Отправить" (здесь вызывается метод POST) после успешной отправки и попробовать нажать кнопку "Назад" в вашем браузере., вы получите ошибку или новую пустую форму вместо последней страницы с заполненной формой.
Я нахожу этот список довольно полезным
ПОЛУЧАТЬ
- GET-запросы могут кэшироваться
- GET-запросы остаются в истории браузера
- Запросы GET можно добавить в закладки
- Запросы GET (почти) никогда не должны использоваться при работе с конфиденциальными данными.
- Запросы GET имеют ограничения по длине
- Запросы GET следует использовать только для получения данных
ПОЧТА
- POST-запросы не кэшируются
- POST-запросы не сохраняются в истории браузера
- Запросы POST не могут быть добавлены в закладки
- POST-запросы не имеют ограничений на длину данных
+------------+---------------------------------------+---------------------------------------+
| | GET | POST |
+------------+---------------------------------------+---------------------------------------+
|BACK button | Harmless | Data will be re-submitted |
| /Reload | | (the browser should alert |
| | | the user that the data are |
| | | about to be re-submitted) |
+------------+---------------------------------------+---------------------------------------+
|Bookmarked | Can be bookmarked | Cannot be bookmarked |
+------------+---------------------------------------+---------------------------------------+
|Cached | Can be cached | Not cached |
+------------+---------------------------------------+---------------------------------------+
|Encoding | application/x-www-form-urlencoded | application/x-www-form-urlencoded |
| type | | multipart/form-data. |
| | | Use multipart encoding for binary data|
+------------+---------------------------------------+---------------------------------------+
|History | Parameters remain | Parameters are |
| | in browser history | not saved in browser history |
+------------+---------------------------------------+---------------------------------------+
|Restrictions| Yes, when sending data | No restrictions |
|on |the GET method adds the data to the URL| |
|data length |and the length of a URL is limited | |
| |(maximum URL length is 2048 characters)| |
+------------+---------------------------------------+---------------------------------------+
|Restrictions| Only ASCII characters | No restrictions. |
|on data type| | Binary data is also allowed |
+------------+---------------------------------------+---------------------------------------+
|Security | GET is less secure compared to POST | POST is a little safer |
| | because data sent is part of the URL | than GET because the parameters |
| | | are not stored in browser history |
| | Never use GET when | or in web server logs |
| | sending passwords |or in web server logs |
| | or other sensitive information! | |
+------------+---------------------------------------+---------------------------------------+
|Visibility | Data is visible to everyone in the URL| Data is not displayed in the URL |
+------------+---------------------------------------+---------------------------------------+
Следует отметить несколько важных замечаний
По объяснению w3cschools.com
Для получения метода:
GET-запросы могут быть кэшированы
GET запросы остаются в истории браузера
GET запросы могут быть добавлены в закладки
Запросы GET никогда не должны использоваться при работе с конфиденциальными данными.
GET-запросы имеют ограничения по длине
GET-запросы должны использоваться только для получения данных
Для почтового метода
POST-запросы никогда не кэшируются
POST-запросы не сохраняются в истории браузера
POST-запросы не могут быть добавлены в закладки
POST-запросы не имеют ограничений по длине данных
Получить более подробную информацию о
GET
метод:
Используется только для отправки 256 символов даты
При использовании этого метода информацию можно увидеть в браузере
Это метод по умолчанию, используемый формами
Это не так безопасно.
POST
метод:
Используется для отправки неограниченных данных.
При использовании этого метода информация не отображается в браузере.
Вы можете явно упомянуть
POST
методЭто более надежно, чем
GET
методЭто обеспечивает более продвинутые функции