Оба HTTP метода GET и POST используются для передачи параметров в программу на PHP. Посмотрим, как выглядят запросы браузера пользователя к серверу, где выполняется наша программа.

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

 GET /test?param1=value1&param2=value2 HTTP/1.1
Host: azbukaweb.ru 

В запросе POST данные передаются в теле заголовка и не отображаются на экране в строке адреса браузера:

 POST /test HTTP/1.1
Host: azbukaweb.ru
param1=value1&param2=value2 

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

Правило 1. Если передаются конфиденциальные данные (пароли, номера кредиток и т.п.), то нужно использовать метод POST

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

Особенностиметода GET:

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

В соответствии с RFC 2616, установлено соглашение, что методы GET и HEAD никогда не должны выполнять какие либо функции помимо доставки информации. Эти методы должны рассматриваться как вполне безопасные. Это позволяет агентам пользователя представлять другие методы, такие как POST, PUT и DELETE, особым способом, так что пользователь сам будет заботиться о возможности опасных операций, которые могут быть выполнены в результате реализации запроса. Поэтому:

Правило 2. Для небезопасных действий используют запрос POST, а для безопасных - GET

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

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

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

Правило 3. Для работы с большими данными исползовать метод POST

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

Правило 4. Используйте GET в AJAX приложениях

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

Запрос > 2048 символов?
   |        |
  НЕТ      ДА  -> POST
   | 
Запрос содержит конфиденциальную информацию?
   |        |
  НЕТ      ДА  -> POST
   | 
Действие Безопасное?
   |        |
  НЕТ      ДА
   |        |
   |    Есть выгода от GET 
   |        |        |
   |       НЕТ      ДА  -> GET
   |        |
   |        |------------> POST
   |
Можно ли сделать его безопасным?
   |        |
  НЕТ      ДА  -> Любой (GET)
   | 
   |---------------------> POST

Рубрики: 

Ярлыки: