Как мне выбирать между методами GET и POST в HTML-формах?

Я хочу знать все плюсы и минусы использования этих двух методов. В частности, последствия для веб-безопасности.

Спасибо.


person David Ameller    schedule 21.09.2008    source источник
comment
http://carsonified.com/blog/dev/the-definitive-guide-to-get-vs-post/ - отличная статья об этом.   -  person levinalex    schedule 18.08.2009


Ответы (17)


Чтобы выбирать между ними, я использую это простое правило:

ПОЛУЧИТЬ для чтения. (чтение данных и их отображение)

POST для всего, что пишет (например, обновление таблицы базы данных, удаление записи и т. Д.)

Другое соображение заключается в том, что GET имеет максимальную длину URI и, конечно же, не может обрабатывать загрузку файлов.

На этой странице есть хорошее резюме.

person David McLaughlin    schedule 21.09.2008
comment
Насколько я могу судить, ограничение на количество символов URI составляет тысячи символов для всех основных браузеров, так что это не должно быть проблемой. - person Ali; 21.09.2008
comment
Это стало проблемой для меня, когда я отправлял формы AJAX. Если у вас есть поля текстовой области, вам нужно будет выполнить POST, иначе вы рискуете потерять текст в тех случаях, когда пользователь вводит больше, чем установлено. - person David McLaughlin; 21.09.2008
comment
Согласно support.microsoft.com/kb/208427 максимальная длина URL (включая строку запроса) в IE - 2048 символов. - person JacquesB; 21.09.2008
comment
Ограничения длины URL-адреса также подняли голову, например, API Google Graph. У кого-то, рассматривающего подобное приложение с интенсивным использованием данных, будет веская причина подумать, будет ли метод GET жизнеспособным. - person Josh Millard; 21.09.2008
comment
Итак, если конечной точке требуется загрузка файла, то независимо от того, является ли это конечной точкой чтения или конечной точкой записи, мы должны сделать это POST? - person variable; 16.12.2019

И GET, и POST имеют свое место. Вы не должны полагаться ни на один из них в плане безопасности.

GET запросы

  • легко доступны
  • легко добавить в закладки
  • подлежат ограничению длины URI
  • может отображать параметры в журналах доступа

POST запросы

  • позволяет загружать файлы
  • позволяет большие данные
  • не показывает параметры в адресной строке браузера

Вы хотите, чтобы результат отправки формы был добавлен в закладки (например, поиск Google)? Используйте GET.

Хотите, чтобы результат отправки формы был кэшируемым? Используйте GET.

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

Вам нужна загрузка файлов? Используйте POST.

person Micke    schedule 21.09.2008

GET не должен иметь побочных эффектов: http://www.w3.org/DesignIssues/Axioms.html#state

Формы POST следует использовать, когда отправка имеет побочные эффекты.

Ни один из методов не имеет реального значения для безопасности, используйте SSL, если вас беспокоит безопасность.

person Aaron Maenpaa    schedule 21.09.2008

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

Если вы перезагрузите страницу, запрошенную GET, браузер просто снова получит URL-адрес (с сервера или из кеша). Однако, если вы перезагрузите POST, браузер покажет немного сбивающее с толку всплывающее окно с предупреждением о репосте данных, которое пользователь может затем отмените (что приведет к еще более запутанной странице с истекшим сроком действия). То же самое, если вы используете назад или историю, чтобы вернуться на страницу, которая является результатом POST.

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

Замечание относительно безопасности: если у вас есть поле пароля в GET-форме, пароль будет замаскирован для посторонних глаз, когда вы его введете, однако он будет четко виден в адресной строке, когда вы нажмете «Отправить»! Но кроме этого, ни в GET, ни в POST нет реальной безопасности, поэтому используйте SSL, если это вызывает беспокойство.

person JacquesB    schedule 21.09.2008


GET передает данные в URL-адресе, POST передает те же данные в содержимом HTTP, оба они абсолютно одинаковы с точки зрения безопасности (то есть полностью небезопасны, если вы не сделаете что-то самостоятельно, например, используя HTTPS).

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

С точки зрения стандарта HTTP запросы GET не должны изменять сайт, и браузеры / пауки с гораздо большей вероятностью будут делать запросы GET самостоятельно (без фактического нажатия пользователем чего-либо), чем запросы POST.

person Nir    schedule 21.09.2008

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

Что такое GET HTTP Request? Протокол HTTP поддерживает несколько методов запроса, которые вы можете использовать при отправке запроса по протоколу HTTP или HTTPS. GET - один из них. Как следует из названия, метод GET предназначен для получения страницы с HTTP-сервера. Одним из важных свойств запроса GET является то, что любой параметр запроса или параметр запроса передается в виде строки в кодировке URL, добавленной с помощью символа "?" символ, который делает его небезопасным, потому что любая информация, которую вы передаете в строке URL-адреса, видна всем.

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

Что такое метод POST HTTP POST HTTP-запрос обозначается методом: POST в HTTP-запросе. В методе POST данные не отправляются как часть строки URL-адреса на сервер, а в методе POST данные отправляются как часть тела сообщения. Почти весь запрос аутентификации отправляется методом POST в мире HTTP. Метод POST безопасен, потому что данные не отображаются в строке URL-адреса и могут быть безопасно зашифрованы с помощью HTTPS для дополнительной безопасности. Вся важная и конфиденциальная информация, отправляемая на сервер, должна отправляться по запросу POST и через HTTPS (HTTP с SSL). Метод POST также используется для отправки информации на сервер, любой информации, которая может изменить состояние приложения, например, добавление товара в корзину, осуществление платежей и т. Д. Вот несколько примеров, когда вам следует рассмотреть возможность использования метода POST в HTTP-запросе: Используйте POST, если вы отправка больших данных, которые не помещаются в URL в случае GET. Используйте метод POST, если вы передаете конфиденциальную информацию на сервер, например. user_id, пароль, номер учетной записи и т. д. Используйте метод POST, если вы отправляете данные, которые могут изменить состояние приложения, например. добавление товаров в корзину для передачи этой корзины для обработки платежа. Используйте POST, если вы пишете безопасное приложение и не хотите отображать параметры запроса в URL-адресе.

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

Метод GET передает параметр запроса в строке URL-адреса, а метод POST передает параметр запроса в теле запроса. Запрос GET может передавать только ограниченное количество данных, в то время как метод POST может передавать большой объем данных на сервер. Запрос GET может быть добавлен в закладки и кеширован, в отличие от запросов POST. GET в основном используется для целей просмотра (например, SQL SELECT), в то время как POST в основном используется для целей обновления (например, SQL INSERT или UPDATE).

Ссылка отсюда

person Arun G    schedule 05.11.2012

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

С точки зрения безопасности обратная сторона использования GET заключается в том, что все отправленные данные будут в URL-адресе и, следовательно, хранятся локально на клиенте в истории браузера.

person Steve M    schedule 21.09.2008

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

person slim    schedule 21.09.2008

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

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

Поэтому я всегда предлагал использовать POST вместо GET.

person Anheledir    schedule 21.09.2008

Ответ Дэвида М получил мой голос.

Я просто хотел добавить один предмет, о котором я слышал, может это была городская легенда ??

У кого-то был сайт со ссылками, которые предназначались только для внутреннего использования для удаления файлов с их сайта. Все было хорошо, пока веб-паук (я думаю, это был Google) каким-то образом не нашел эти ссылки и весело следил за каждой из них, в результате чего все файлы на его сайте были удалены. Ссылки использовали GET и должны были использовать POST, поскольку пауки не переходят по ссылкам POST.

person KPexEA    schedule 21.09.2008
comment
Правдивая история. Жертв было немало. - person Quentin; 18.08.2009
comment
Возможно, это именно та история, которую вы имели в виду? thedailywtf.com/Articles/The_Spider_of_Doom.aspx Пользователи с файлом cookie isLoggedOn не могли удалять контент, пользователи, полностью лишенные файлов cookie, такие как googlebot, могут! По-видимому, у Google Web Accelerator, который сейчас не поддерживается, были аналогичные проблемы с предварительной выборкой ссылок на удаление для пользователей, вошедших в систему: - person Stefan L; 29.04.2010

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

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

http://en.wikipedia.org/wiki/Post/Redirect/Get

person Ali    schedule 21.09.2008

Это зависит от типа и размера данных, которые вы хотите передать. С помощью GET вы можете передать на страницу действия максимум 255 символов. При использовании метода POST таких ограничений нет. POST обеспечивает большую конфиденциальность данных, поскольку они нигде не отображаются. Все, что вы отправляете с помощью метода GET, отображается в адресной строке брокера.

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

person Aravind    schedule 21.09.2008

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

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

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

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

person Spudley    schedule 16.09.2010

Одна ловушка, которую я заметил на днях, было настоящим "ДУХ!" момент для меня.

У нас есть сторонняя поисковая система на нашем сайте, и они используют метод GET для отправки поискового запроса в свой код. Вдобавок у меня был код, который искал возможные атаки с использованием SQL-инъекций в строке запроса. Мой код все испортил, потому что искал такие слова, как «EXEC», «UPDATE», «DELETE» и т. Д. Ну, оказывается, пользователь искал «EXECUTIVE MBA», а мой код нашел «EXEC» в «EXECUTIVE» "и забанили их IP.

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

person domusvita    schedule 21.09.2008
comment
Тебе действительно не следует этого делать. Это разновидность занесения в черный список, что, как правило, не является хорошей идеей для безопасности. Вместо этого убедитесь, что ваши SQL-запросы имеют обратную косую черту, так что SQL-инъекция вообще невозможна. - person Ali; 21.09.2008

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

person Turnkey    schedule 21.09.2008

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

Если необходимо, используйте SSL для безопасности.

Хороший совет: всегда используйте POST для форм, используйте строки запроса (? Value = products), когда вы не публикуете сообщения, а пытаетесь ПОЛУЧИТЬ определенную страницу, например страницу продукта. Отсюда и названия POST и GET :)

person Jesper Blad Jensen    schedule 21.09.2008
comment
Используемый вами метод не имеет ничего общего с безопасностью. Используйте SSL, если вы беспокоитесь о безопасности. Кроме того, формы GET служат для различных целей, например для поиска. - person Aaron Maenpaa; 21.09.2008
comment
Я заявил, что SSL предназначен для обеспечения безопасности, и ни один из них не является безопасным. Правильно, что формы GET полезны для поиска и прочего, но я не заявлял, что это не так. Так что я не понимаю, почему вы критикуете мой пост или пытаетесь поправить меня, говоря то же самое, что и я :) - person Jesper Blad Jensen; 21.09.2008
comment
Джеспер, вы заявляете: ... GET менее безопасен в том смысле, что он очень заметен ... Что является подделкой. Не знаю, как можно утверждать иначе. - person Shog9; 21.09.2008
comment
Да, и это правильно. Безопасность - это то, насколько легко взломать. Большинство систем безопасности можно взломать, но это очень сложно. То же самое верно для POST и GET - оба очень легко взломать, но GET просто немного легче для обычного человека увидеть, а затем изменить. - person Jesper Blad Jensen; 22.09.2008
comment
Если ваша система настолько плохо написана, что URL-адрес предоставляет достаточно подсказок о том, как ее сломать, что кто-то, кто не знает достаточно для проверки данных POST, может вызвать проблемы, тогда у вас есть более серьезные проблемы, чем выбор между GET и POST. - person Quentin; 18.08.2009