Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Самоучитель по PHP 4

.pdf
Скачиваний:
61
Добавлен:
02.05.2014
Размер:
4.36 Mб
Скачать

Глава 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 — довольно непростая работа, которая обычно поручается профес- сионалам. Далее приводятся инструкции с довольно скупыми объяснениями, почему нужно сделать то или иное действие, в расчете на то, что вы будете соблюдать их буквально. В противном случае вам, скорее всего, придется до- полнительно провести пару неприятных часов (или дней) за изучением доку-