Самоучитель по PHP 4
.pdfГлава 3. CGI изнутри |
71 |
Получение Cookies из браузера
Получить Cookies для сценария несколько проще: все они хранятся в переменной окружения HTTP_COOKIE в таком же формате, как и QUERY_STRING, только вместо & используется ;. Например, если мы установили два Cookies: cookie1=value1 и cookie2=value2, то в переменной окружения HTTP_COOKIE будет следующее:
cookie1=value1;cookie2=value2.
Сценарий должен разобрать эту строку, распаковать ее и затем работать по своему усмотрению.
Пример программы для работы с Cookies
В заключение приведу простой сценарий, который использует Cookies. Для упрощения в нем не производится URL-кодирование и декодирование — будем считать, что пользователь может печатать только на латинице.
Листинг 3.8. Простой сценарий, использующий Cookies
#include <stdio.h> #include <stdlib.h>
//начало программы void main() {
//Временный буфер char Buf[1000];
//получаем в переменную Cook значение Cookies char *Cook = getenv("HTTP_COOKIE");
//пропускаем в ней 5 первых символов ("cook="), если она не пустая –
//получим как раз значение Cookie, которое мы установили ранее
//(см. ниже).
Cook += 5; // сдвинули указатель на 5 символов вперед по строке
//получаем переменную QUERY_STRING char *Query = getenv("QUERY_STRING");
//проверяем, заданы ли параметры у сценария — если да, то
//пользователь, очевидно, ввел свое имя или нажал кнопку,
//в противном случае он просто запустил сценарий без параметров if(strcmp(Query, "")) { // строка не пустая?
//копируем в буфер значение QUERY_STRING,
72 |
Часть I. Основы Web-программирования |
//пропуская первые 5 символов (часть "name=") -
//получим как раз текст пользователя strcpy(Buf, Query + 5);
//Пользователь ввел имя — значит, нужно установить Cookie printf("Set-cookie: cook=%s; "
"expires=Friday,31-Dec-01 23:59:59 GMT", Buf);
//Теперь это — новое значение Cookie
Cook=Buf;
}
//выводим страницу с формой printf("Content-type: text/html\n\n"); printf("<html><body>\n");
//если имя задано (не пустая строка), приветствие if(strcmp(Cook, ""))
printf("<h1>Привет, %s!</h1>\n",Cook);
//продолжаем
printf("<form action=/cgi-bin/script.cgi method=get>\n"); printf("Ваше имя: ");
printf("<input type=text name=name value=’%s’>\n",Cook); printf("<input type=submit value=’Отправить’>\n"); printf("</form>\n");
printf("</body></html>");
}
Теперь при первом заходе на этот URL пользователь получит форму с пустым полем для ввода имени. Если он что-то туда напечатает и нажмет кнопку отправки, его информация запомнится браузером. Итак, посетив в любое время до 31 декабря 2001 года этот же URL, он увидит то, что напечатал давным-давно в текстовом поле. И, что самое важное, — его информацию "увидит" также и сценарий. Кстати, у злоумышленника нет никаких шансов получить значение Cookie посетителя, потому что оно хранится у него на компьютере, а не на сервере.
И опять я намекаю на то, что использование Си и на этот раз довольно затруднительно. Неудобно URL-декодировать и кодировать при установке Cookies, накладно разбирать их на части, да и вообще наша простая программа получилась слишком длинной. Не правда ли, приятно будет обнаружить, что в PHP все это реализовано автоматически: для работы с Cookies существует всего одна универсальная функция SetCookie(), а получение Cookies от браузера вообще не вызовет никаких проблем, потому что оно ничем не отличается от получения данных формы. Это логично. В
Глава 3. CGI изнутри |
73 |
самом деле, какая нам разница, какие данные пришли из формы, а какие — из Cookies? С точки зрения сценария — все равно...
Но не буду забегать вперед. Займемся пока теорией авторизации.
Авторизация
Часто бывает нужно, чтобы на какой-то URL могли попасть только определенные пользователи. А именно, только те, у которых есть зарегистрированное имя (login) и пароль (password). Механизм авторизации как раз и призван упростить проверку данных таких пользователей.
Я не буду здесь рассматривать все возможности этого механизма по трем причинам. Во-первых, существует довольно много типов авторизации, различающихся степенью защищенности передаваемых данных. Во-вторых, при написании обычных CGIсценариев для того, чтобы включить механизм авторизации, необходимо провести некоторые манипуляции с настройками (файлами конфигурации) сервера, что, скорее всего, будет затруднительно (ведь обычно компания, которая предоставляет услуги по обслуживанию виртуального хоста, не позволяет вмешиваться в настройки сервера). И наконец, в-третьих, весь механизм авторизации значительно упрощается и унифицируется при использовании PHP, и вам не придется ничего исправлять в этих злополучных настройках сервера. Так что давайте отложим практическое знакомство с авторизацией и займемся ее теорией.
Расскажу вкратце о том, как все происходит на нижнем уровне при одном из самых простых типов авторизации — basic-авторизации. Итак, предположим, что сценарий посылает браузеру пользователя следующий заголовок:
WWW-Authenticate: Basic realm="имя_зоны"
HTTP/1.0 401 Unauthorized"
Обратите внимание на то, что последний заголовок несколько отличается по форме от обычных заголовков. Так и должно быть. Строка имя_зоны в первом из них задает некоторый идентификатор, который будет определять, к каким ресурсам будет разрешен доступ зарегистрированным пользователям. При программировании CGIсценариев этот параметр используется в основном исключительно для формирования приветствия (подсказки) в диалоговом окне, появляющемся в браузере пользователя (там отображается имя зоны), так что мы не будем вдаваться в детали относительно него.
Затем, как обычно, посылается тело документа (сразу отмечу, что именно это тело ответа будет выдано пользователю, если он нажмет в диалоговом окне (см. ниже) кнопку Cancel, т. е. отменит вход). В этом случае происходит нечто удивительное: в браузере пользователя появляется небольшое диалоговое окно, в котором предлагается вести login и password. После того как пользователь это сделает, управление пере-
74 |
Часть I. Основы Web-программирования |
дается обратно серверу, который среди обычных заголовков запроса (которые посылает браузер) получает примерно такой:
Authorization: Basic TG9naW46UGFzcw==
Это — ни что иное, как закодированные данные, введенные пользователем. Теоретически, далее этот заголовок должен каким-то образом передаться сценарию (для этого как раз и необходимо добавление команд в файлы конфигурации сервера). Сценарий, декодировав его, может решить: то ли повторить всю процедуру сначала (если имя или пароль неправильные), или же начать работать с сообщением "OK, все в порядке, вы — зарегистрированный пользователь".
Предположим, что сценарий подтвердил верность данных и "пропустил" пользователя. В этом случае происходит еще одна вещь: login и password пользователя запоминаются в скрытом Cookie, "живущем" в течение одной сессии работы с браузером. Затем, что бы мы ни делали, заголовок
Authorization: Basic значение_Cookie
будет присылаться для любого сценария (и даже для любого документа) на нашем сервере. Таким образом, посетителю, зарегистрировавшемуся однажды, нет необходимости каждый раз заново набирать свое имя и пароль в течение текущего сеанса работы с браузером, т. е., пока пользователь его не закроет.
И еще: после верной авторизации при вызове любого сценария будет установлена переменная окружения REMOTE_USER, содержащая имя пользователя. Так что в дальнейшем можно ее задействовать для определения того, какой же посетитель зарегистрировался.
ЧАСТЬ II.
ВЫБОР И НАСТРОЙКА ИНСТРУМЕНТАРИЯ. WEB-СЕРВЕР APACHE
Глава 4
Установка Apache
Введение: зачем нужен домашний сервер?
Эта часть книги поможет вам "скачать" и установить один из лучших серверов — Apache, а также те приложения, из-за которых большинство программистов и любят Apache для Windows 95/98. Имеются в виду, конечно, интерпретатор PHP и популярная СУБД MySQL, также работающие под Windows. Прочитав эту часть книги и скачав дистрибутивы (заметьте, совершенно бесплатно!), вы будете вооружены всеми инструментами, которые так необходимы для профессиональной работы в Web!
Бытует мнение, что MySQL (а тем более для Windows 95/98) нельзя получить бесплатно, а можно только купить. Так вот, можете вздохнуть с облегчением: недавно разработчики MySQL выпустили бесплатную версию сервера для Windows 95/98, вы можете загрузить самую последнюю ее версию на офици-
альном сайте MySQL: http://www.mysql.com.
Даже если вы и не планируете в будущем использовать PHP, а предпочитаете другой язык (например, Perl), то после внимательного ознакомления с этой частью книги вы сможете на порядок упростить себе жизнь — точнее, ее часть, касающуюся написания и отладки сценариев. И это благодаря тому, что все описанное здесь почти на 100% совместимо с тем программным обеспечением, которое скорее всего установлено у вашего хостинг-провайдера (а больше половины современных хостинг-провайдеров работают с Unix, но не с Windows). Однако, если вы собираетесь всерьез заняться хостингом на платформе Win32, то лучше, наверное, будет использовать не Apache и PHP, а MIIS (Microsoft Internet Information Server — Информационный сервер Интернета Microsoft) и ASP (Active Server Pages — Активные серверные страницы), про которые, я уверен, написано множество других книг.
Эта часть книги, как уже говорилось, будет полезна не только программистам на PHP. Ведь часто возникает ситуация, когда необходимо проверить полный вид HTML-страницы. Однако чаще всего это невозможно при работе дома — технологии
SSI (Server-Side Includes — Включения на стороне сервера), CGI (Common Gateway Interface — Общий шлюзовой интерфейс) и, конечно, PHP требуют использования сервера. Как же быть? Не стоит впадать в апатию — нужно просто установить на ваш
80 |
Часть II. Выбор и настройка инструментария. Web-сервер Apache |
домашний компьютер (пусть даже и не подключенный к Интернету) специальную программу — Web-сервер. Вообще-то серверов существует множество — плохие и хорошие, медленные и быстрые... Я предлагаю вам установить сервер, подпадающий под категории, следующие за "и". А именно — Apache. Самое главное то, что это чуть ли не единственный сервер, который позволяет работать в Windows 95/98 с технологиями PHP, CGI и Perl-сценариями одновременно так же просто и непринужденно, как будто у вас инсталлирована Unix.
Дистрибутивы и ссылки
Я привожу список ссылок на сайты, на которых всегда можно найти самые свежие версии программных продуктов. Все описываемые здесь программы были загружены и установлены мной именно с этих сайтов. Итак:
rофициальный сайт Apache: http://www.apache.org;
rофициальный сайт PHP: http://www.php.net;
rофициальный сайт MySQL: http://www.mysql.com;
rофициальный сайт Active Perl: www.activestate.com;
И еще несколько ссылок, полезных Web-программисту.
rВсероссийский Клуб Веб-мастеров: http://www.webclub.ru.
rКлуб разработчиков PHP: http://www.phpclub.net.
rЛаборатория dk: http://www.dklab.ru.
От слов к делу: установка Apache
Итак, вы решились установить на свой компьютер Apache для Windows 95/98. В таком случае вам следует запастись терпением и для начала "скачать" дистрибутив сервера с официального сайта Apache: http://www.apache.org. Советую вам выбрать самую последнюю версию сервера для платформы Windows. Теперь нам предстоит настройка Apache для вашей системы.
Мы попросим вас в точности выполнять перечисленные ниже шаги, не пропус- кая и не откладывая ни одного. Дело в том, что конфигурирование и настройка Apache — довольно непростая работа, которая обычно поручается профес- сионалам. Далее приводятся инструкции с довольно скупыми объяснениями, почему нужно сделать то или иное действие, в расчете на то, что вы будете соблюдать их буквально. В противном случае вам, скорее всего, придется до- полнительно провести пару неприятных часов (или дней) за изучением доку-