программы для работы с 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? С точки зрения сценария — все равно...
Но не буду забегать вперед. Займемся пока теорией авторизации.