| Раздел: PHP, MySQL, веб-программирование | Автор: foxweb |
| E-mail: |
Www: [не указан] |
| Просмотров: 4530 | Дата: 12.02.2007 |
Методы GET и POST — это два различных способа передачи данных HTTP-серверу, точнее PHP- или другому CGI-скрипту для последующей обработки. Почему "метод" и что в данном контексте означает термин "метод"? Как всем уже известно, обмен данными между браузером производится по протоколу HTTP. Этот протокол позволяет читать, посылать, сохранять и удалять файлы (ресурсы) на HTTP-сервере.
Интересно заметить, что на заре своего развития (1995-1998 годы) интерпретатор PHP задумывался как универсальный обработчик форм и назывался "PHP/FI", где FI — Form Interpreter, "интерпретатор форм". На тот момент практически не было средств, которые позволяли также удобно и просто работать с формами, как PHP. Это и привело к большому распространению и развитию языка PHP. К примеру, в языках Perl и C/C++, чтобы получить данные формы, приходилось либо писать большую и страшную функцию декодирования HTTP-запросов, либо пользоваться не менее громоздкими библиотеками поддержки CGI. В языке PHP данные форм были доступны сразу с момента вызова скрипта.
Чтобы понять, что происходит при запросе из браузера адреса 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. В этом случае данные передаются не в 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 — только в формах.