САМОУЧИТЕЛЬ PHP 4

программы для работы с 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,
    // ïðîïóñêàÿ ïåðâûå 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 от браузера вообще не вызовет никаких проблем, потому что оно ничем не отличается от получения данных формы. Это логично. В самом деле, какая нам разница, какие данные пришли из формы, а какие — из Cookies? С точки зрения сценария — все равно...
Но не буду забегать вперед. Займемся пока теорией авторизации.

Содержание раздела