РНР 5 в подлиннике

Страница 51 из 554


104

Часть I. Основы Web-программирования

Пример программы для работы с cookies

В заключение приведем простой сценарий, который использует cookies (листинг 3.8). Для упрощения в нем не производится URL-кодирование и декодирование — будем считать, что пользователь может печатать только на латинице.

! Листинг 3.8. Файл c/cookies.c

// Простой сценарий, использующий 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,

// пропуская первые 5 символов (часть "name=") -

// получим как раз текст пользователя

strcpy(Buf, Query + 5) ;

// пользователь ввел имя — значит, нужно установить cookie printf("Set-cookie: cook=%s; "

"expires=Sunday, 2-Feb-03 15:52:00 GMT", Buf); // Теперь это новое значение cookie Cook=Buf;

}

// выводим страницу с формой

printf("Content-type: text/html\n\n");

printf ("<htmlxbody>\n") ;

// если имя задано (не пустая строка), приветствие if(strcmp (Cook, ""))

printf ("<Ы>Привет, %s ! </hl>\n", Cook) ; // продолжаем

printf("<form action=/cgi-bin/script.cgi method=get>\n") ; printf("Ваше имя: ");

printf("<input type=text name=name value=1%s'>\n",Cook); printf("<input type-submit value='Отправить 1>\n"); printf("</form>\n"); printf("</body></html>") ;

Гпава 3. CGI изнутри

105

Теперь при первом заходе на этот URL пользователь получит форму с пустым полем для ввода имени. Если он что-то туда напечатает и нажмет кнопку отправки, его информация запомнится браузером. Итак, посетив в любое время до 2 февраля 2003 г. этот же URL, он увидит то, что напечатал давным-давно в текстовом поле. И, что самое важное, — его информацию "увидит" также и сценарий. Кстати, у злоумышленника нет никаких шансов получить значение cookie посетителя, потому что оно хранится у него на компьютере, а не на сервере.

И опять мы намекаем на то, что использование языка С и на этот раз довольно затруднительно. Неудобно URL-декодировать и кодировать данные при установке cookies, накладно разбирать их на части, да и вообще наша простая программа получилась слишком длинной. Не правда ли, приятно будет обнаружить, что в РНР все это реализовано автоматически: для работы с cookies существует всего одна универсальная функция Setcookieo, а получение cookies от браузера вообще не вызовет никаких проблем, потому что оно ничем не отличается от получения данных формы. Это логично. В самом деле, какая нам разница, какие данные пришли из формы, а какие — из cookies? С точки зрения сценария — все равно...

Но не будем забегать вперед. Займемся пока теорией авторизации.

Авторизация

Часто бывает нужно, чтобы на какой-то URL могли попасть только определенные пользователи. А именно только те, у которых есть зарегистрированное имя (login) и пароль (password). Механизм авторизации как раз и призван упростить проверку данных таких пользователей.

Мы не будем здесь рассматривать все возможности этого механизма по трем причинам. Во-первых, существует довольно много типов авторизации, различающихся степенью защищенности передаваемых данных. Во-вторых, при написании обычных CGI-сценариев для того, чтобы включить механизм авторизации, необходимо провести некоторые манипуляции с настройками (файлами конфигурации) сервера, что, скорее всего, будет затруднительно (ведь обычно компания, которая предоставляет услуги по обслуживанию виртуального хоста, не позволяет вмешиваться в настройки сервера). И наконец, в-третьих, весь механизм авторизации значительно упрощается и унифицируется при использовании РНР, и вам не придется ничего исправлять в этих злополучных настройках сервера. Так что давайте отложим практическое знакомство с авторизацией и займемся ее теорией.

Расскажем вкратце о том, как все происходит на нижнем уровне при одном из самых простых типов авторизации — basic-авторизации. Итак, предположим, что сценарий посылает браузеру пользователя следующий заголовок:

WWW-Authenticate: Basic геа!т="имя_зоны" HTTP/1.0 401 Unauthorized

Обратите внимание, что последний заголовок несколько отличается по форме от обычных заголовков. Так и должно быть. Строка иыя_зоны в первом из них задает некоторый идентификатор, определяющий, к каким ресурсам будет разрешен доступ зарегистрированным пользователям. При программировании CGI-сценариев этот параметр используется в основном исключительно для формирования приветствия



  • Контакты массажного салона.

  Hostland.Ru

 «Бесплатный хостинг Hostland.Su» © 2006