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

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

Спасибо.

http://carsonified.com/blog/dev/the-definitive-guide-to-get-‌ vs-post / is an exellent article about this.
levinalex 18.08.2009 17:17
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
21
1
6 309
17
Перейти к ответу Данный вопрос помечен как решенный

Ответы 17

Ответ принят как подходящий

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

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

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

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

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

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

Ali 21.09.2008 18:50

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

David McLaughlin 21.09.2008 18:57

Согласно support.microsoft.com/kb/208427 максимальная длина URL (включая строку запроса) в IE составляет 2048 символов.

JacquesB 21.09.2008 20:00

Ограничения длины URL-адреса также подняли голову, например, API Google Graph. У кого-то, рассматривающего подобное приложение с интенсивным использованием данных, будет веская причина подумать, будет ли метод GET жизнеспособным.

Josh Millard 21.09.2008 20:48

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

variable 16.12.2019 09:24

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

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

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

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

Aaron Maenpaa 21.09.2008 17:00

Я заявил, что SSL предназначен для обеспечения безопасности, и ни один из них не является безопасным. Правильно, что формы GET полезны для поиска и прочего, но я не заявлял, что это не так. Так что я не понимаю, почему вы критикуете мой пост или пытаетесь поправить меня, говоря то же самое, что и я :)

Jesper Blad Jensen 21.09.2008 21:05

Джеспер, вы утверждаете: «... GET менее безопасен в том смысле, что он очень заметен ...». Это подделка. Не знаю, как можно утверждать иначе.

Shog9 21.09.2008 21:07

Да, и это правильно. Безопасность - это то, насколько легко взломать. Большинство систем безопасности можно взломать, но это очень сложно. То же самое верно для POST и GET - оба очень легко взломать, но GET просто немного легче для обычного человека увидеть, а затем изменить.

Jesper Blad Jensen 22.09.2008 10:56

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

Quentin 18.08.2009 17:22

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

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

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

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

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

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

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

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

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

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

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

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

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

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

GET запросы

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

POST запросы

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

Вы хотите, чтобы результат отправки формы был закладки (подумайте о поиске Google)? Используйте ПОЛУЧАТЬ.

Хотите, чтобы результат отправки формы был доступный? Используйте ПОЛУЧАТЬ.

Ваши запросы не идемпотентный (безопасно повторяются)? Используйте ПОЧТОВЫЙ, а затем всегда перенаправлять на страницу, которую можно получить через HTTP GET.

Вам нужен загрузка файлов? Используйте ПОЧТОВЫЙ.

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

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

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

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

Ali 21.09.2008 18:55

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

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

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

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

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

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

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

Правдивая история. Жертв было немало.

Quentin 18.08.2009 17:19

Возможно, это именно та история, которую вы имели в виду? thedailywtf.com/Articles/The_Spider_of_Doom.aspx Пользователи с файлом cookie "isLoggedOn" не могут удалять контент, пользователи, полностью лишенные файлов cookie, такие как googlebot, могут! По-видимому, прекращенный сейчас Google Web Accelerator имел аналогичные проблемы с предварительной выборкой ссылок на удаление для пользователей, вошедших в систему: 37signals.com/svn/archives2/…

Stefan L 29.04.2010 23:24

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

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

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

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

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

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

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

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

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

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

Что такое GET HTTP-запрос? Протокол 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).

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

Другие вопросы по теме