FoxWeb

софт для студентов
Искать здесь

Основы протокола HTTP: GET и POST — в чём разница?

Раздел: PHP, MySQL, веб-программирование Автор: foxweb
E-mail: спаму - нет! Www: [не указан]
Просмотров: 4530 Дата: 12.02.2007
Одна из ключевых особенностей, способствовавших росту популярности языка PHP — это встроенные средства для удобной работы с данными HTML-форм и параметрами URL.

Введение

Методы GET и POST — это два различных способа передачи данных HTTP-серверу, точнее PHP- или другому CGI-скрипту для последующей обработки. Почему "метод" и что в данном контексте означает термин "метод"? Как всем уже известно, обмен данными между браузером производится по протоколу HTTP. Этот протокол позволяет читать, посылать, сохранять и удалять файлы (ресурсы) на HTTP-сервере.

Интересно заметить, что на заре своего развития (1995-1998 годы) интерпретатор PHP задумывался как универсальный обработчик форм и назывался "PHP/FI", где FI — Form Interpreter, "интерпретатор форм". На тот момент практически не было средств, которые позволяли также удобно и просто работать с формами, как PHP. Это и привело к большому распространению и развитию языка PHP. К примеру, в языках Perl и C/C++, чтобы получить данные формы, приходилось либо писать большую и страшную функцию декодирования HTTP-запросов, либо пользоваться не менее громоздкими библиотеками поддержки CGI. В языке PHP данные форм были доступны сразу с момента вызова скрипта.

Метод GET

Чтобы понять, что происходит при запросе из браузера адреса http://foxweb.net.ru/index.php, посмотрите на фрагмент HTTP-запроса:

GET /index.php HTTP/1.1
Host: foxweb.net.ru
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cache-Control: max-age=0

Производится сокет-соединение с хостом foxweb.net.ru на 80-ом порту и по этому соединению передаётся указанный выше текст запроса. Обратите внимание на первые две строки. Согласно протоколу HTTP, в первой строке указывается метод запроса, имя ресурса и версия протокола. Во второй строке указывается DNS-имя хоста, к которому происходит обращение (на одном хосте могут размещаться сотни виртуальных хостов с различными именами). В данном случае применяется метод GET. Этот метод получения документов (страниц, картинок и других файлов) является основным для HTTP-серверов и браузеров. В этом случае браузер лишь сообщает серверу, какй документ необходимо загрузить.

Рассмотрим другой вариант GET-запроса — с параметрами.

Запрашиваемый URL: http://someserver/script.php?a=5&b=10
HTTP-запрос: GET /script.php?a=5&b=10 HTTP/1.1

Что это означает? На сервере someserver находится скрипт script.php. Запросив этот URL, скрипту будут переданы две переменные — a равная 5 и b равная 10. Всё, что идёт справа от знака вопроса — параметры. Их может быть сколько угодно и разделяются они знаком амперсенда & (по секрету говоря, это может быть любой другой знак и вообще параметры могут передаваться в любом формате). Пара "имя=значение" разделяется знаком равенства = . В общем случае в PHP-скрипте эти переменные можно получить через ассоциативный массив $_GET[]. Например echo $_GET[a] выведет на экран 5. Массив значений $_GET[] доступен из любого места программы. Чтобы передать данные GET, нужно всего лишь запросить соответствующий URL, содержащий GET-переменные.

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

Метод POST

Теперь рассмотрим метод POST. В этом случае данные передаются не в URL, а в теле HTTP-запроса, но формат представления очень похож на GET и в скрипте они обрабатываются посредством глобального массива $_POST[имя-поля]. Обычно POST используется при работе с формами, когда данные отправляются на сервер, а не просто запрашивается URL. В этом принципиальное отличие GET от POST.

Пример HTTP-запроса, генерируемого при отправке формы:

POST /index.php HTTP/1.1
Host: foxweb.net.ru
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://foxweb.net.ru/index.php
Cookie: phpbb2mysql_data=a%3A0%3A%7B%7D; pnz=1
Content-Type: application/x-www-form-urlencoded
Content-Length: 39
send=1&q=%EF%F0%E5%E2%E5%E4&where=texts

Обратите внимание на первую и последнюю строки. В первой строке указан метод POST, а это говорит о том, что в теле запроса (последняя строка) передаются данные из HTML-формы. В теле запроса передаются закодированные данные в виде последовательности "имя=значение". В скрипте эти переменные будут доступны через массив $_POST[имя-поля] — $_POST[send], $_POST[q], $_POST[where].

Скрипт, обрабатывающий данные из формы

К примеру, вот простой скрипт сложения двух чисел. Состоит из двух частей: HTML-форма и код вывода суммы. Числа из полей ввода A и B передаются в этот же скрипт методом POST в виде переменных $_POST[a] и $_POST[b], и если они были переданы, то есть не пустые, то под формой выводится результат.

PHP код:

<form name="sum" action="script.php" method="post"> 
Введите A <input name="a" type="text" value=""> 
Введите B <input name="b" type="text" value=""> 
<input type="submit" value="Сложить"> 
</form>
<?php 
if ( $_POST[a] && $_POST[b] ) echo "Результат " . ($_POST[a] + $_POST[b]); 
?>

Работать с меню, кнопками, флажками и файловыми полями можно аналогично, главное чтобы у элемента ввода было имя, которое будет передано в скрипт в виде соответствующей переменной. Смотрите в дополнительной литературе. Добавьте процедуру сохранения введённых строк в файл, вывода содержимого этого файла, и получите простую гостевую книгу!

Безопасность

Методом GET не стоит отправлять конфиденциальные данные вроде паролей, серийных номеров и т. д., так как они передаются открыто через адресную строку и могут быть переданы в виде ссылки. Не стоит также с помощью GET выполнять важные операции, например удаления: script?delete=all, так как поисковики, программы да и сами пользователи могу перейти по этой ссылке. Ну и конечно же самый распространённый способ взлома скриптов — через подбор GET-переменных таким образом, чтобы нарушить работу сайта или получить конфиденциальные данные.

Если переменные GET используются напрямую в SQL-запросах внутри скрипта без фильтрации, то почти на 99% ваш скрипт уязвим для SQL-инъекций. Ведь злоумышленник может просто приписать к URL дополнительную часть SQL-запроса и получить всё, что ему захочется! Поэтому никогда не используйте GET-переменные в SQL-запросах без фильтрации.

Из-за того, что GET-переменные передаются открыто для пользователя, а данные форм  — незаметно, это приводит к ложному ощущению того, что метод POST более безопасен и защищён. Но это не так. Во-первых, злоумышленник, даже не слишком квалифицированный может передать всё, что угодно. Во-вторых, атаку на ваш сайт можно произвести не только с ваших форм, но и из любой другой формы на любом другом сайте. Стоит лишь только указать нужный параметр action у HTML-формы. Поэтому всегда фильтруйте на безопасность все входящие данные!

Подведём итоги

Метод GET ("получить") используется для запроса ресурса (скрипта, страницы) с определёнными параметрами. Метод POST ("отправить") используется для отправки данных на сервер для последующей обработки скриптами. GET- и POST-переменные доступны в PHP-скрипте через массивы $_GET[] и $_POST[] из любого места программы (так как являются суперглобальными). GET используется в ссылках (но иногда может применяться и в формах, пример — http://ya.ru). POST — только в формах.

Комментарии

ketrin li 18.06.2007 14:25:54 #
excellent
KuRaToR 01.11.2007 17:32:36 #
Этот скрипт выдал вот что:
Notice: Use of undefined constant a — assumed 'a' in T:\home\localhost\tes\script.php on line 2

Notice: Use of undefined constant b — assumed 'b' in T:\home\localhost\tes\script.php on line 2

Notice: Use of undefined constant a — assumed 'a' in T:\home\localhost\tes\script.php on line 2

Notice: Use of undefined constant b — assumed 'b' in T:\home\localhost\tes\script.php on line 2
Результат 3

С чем это может быть связано?
Мне это всё очень интересно.
Если можно ответьте на мыло
tvolk@bk.ru
foxweb 01.11.2007 18:47:02 #
Ничего страшного, обычные нотайсы. Это даже не ошибки, а замечания о том, что неплохо бы инициализировать переменные a и b. Нотайсы отключаются в php.ini.

Так понимаю, вы только начинаете знакомство с PHP. Очень рекомендую скачать официальное русскоязычное руководство http://www.php.net/get/php_manual_ru.chm/from/a/mirror
SeWeRd 24.08.2008 17:29:34 #
А Вам не кажется что а и б должны быть в кавычках, иначе как-то не правильно??
Ну это моё личное мнение.
Да и нотайсы это не то, на что просто кладёшь и всё хорошо...

Оставить комментарий

Ваше имя

Ваш комментарий

Код   Защитный код. Если вы не видите здесь рисунок - обновите страницу.
Оценка   

Заметки по этой теме