Логические операторы && (AND) и || (OR). 3 страница
<OPTION VALUE=\"None\">None</SELECT><P>
<INPUT TYPE=\"hidden\" NAME=\"hiddendata\" VALUE=\"Rosebud\">
<CENTER><INPUT TYPE=\"submit\" NAME=\"submit\">
<INPUT TYPE=\"reset\"></CENTER><HR></FORM>";
print &HtmlBot;
Листинг 5.11. lib2.pl
#!/usr/local/bin/perl
#require 'cgi-lib.pl';
use CGI qw/:ReadParse, PrintHeader, HtmlTop, HtmlBot, SplitParam/;
print &PrintHeader;
print &HtmlTop ("CGI Example Using cgi-lib.pl");
print "<BODY BGCOLOR=\white\ LINK=\ red\><p>
<CENTER><H1>Thank you for filling out our survey.</H1></CENTER>
<H3>Here are your responses...</H3>";
if (&ReadParse(*in)) {print "Your name is: <EM>", $in{'text'},
"</EM>.", "<p>","Your opinions are. <EM>", $in{'textarea'},
"</EM>.","<p>", "You use these products. <EM>",
join(", ", &SplitParam($in{'checkboxes'})), "</EM>.<p>",
"Your income level is: <EM>",$in{'list'},
"</EM>.<p>Today is day <EM>", $in{'radios'},
"</EM> of the week.<p>","How much uncolicited mail you like<EM>",
$in{'popupmenu'}, "</EM>.", "<p>",
"The hidden data is <EM>", $in{'hiddendata'}, "</EM>."; }
print &HtmlBot;
Какие подпрограммы входят в состав cgi-lib.pl?Вот их список:
CgiDie — как и CgiError, печатает сообщение об ошибке и, кроме того, останавливает программу.
CgiError — печатает сообщение об ошибке, используя стандартные заголовки и HTML-код.
HtmlBot — возвращает строку"</BODY>\n</HTML>\n".
HtmlTop — возвращает раздел <HEAD> документа HTML и открывает раздел <BODY>. Необязательный строковый параметр используется в качестве названия Web-страницы: добавляется тег HTML <H1> с этим названием.
MethGet — возвращает значение истина, если текущий вызов CGI сделан при помощи метода GET. В противном случае возвращается значение ложь.
MethPost — возвращает значение истина, если текущий вызов CGI сделан при помощи метода POST. В противном случае возвращается значение ложь.
MyBaseUrl — возвращает базовый адрес (base URL) CGI-сценария, без дополнительного пути или строк запроса.
MyFullUrl — возвращает базовый адрес (base URL) CGI-сценария, включая дополнительный путь и строки запроса.
PrintEnv — форматирует и печатает переменные среды, доступные сценарию.
PrintHeader — возвращает строку "Content-type: text/html\n\n". С нее должны начинаться все Web-страницы, создаваемые cgi-lib.pl.
PrintVariables — форматирует и печатает значения данных. Ей передается хэш или запись таблицы символов (для вывода элементов соответствующего массива). Без аргументов PrintVariables выводит содержимое хэша %in.
ReadParse — основная подпрограмма библиотеки cgi-lib.pl. Она читает и разбирает данные, переданные CGI-сценарию методами GET или POST. Обычно она используется для создания хэша %in: ей передается запись таблицы символов *in. Хэш содержит данные, переданные сценарию, упорядоченные по именам соответствующих элементов управления. Необязательные второй, третий и четвертый параметры указывают на то, что надо заполнить соответствующие хэши данными из принятых файлов.
SplitParam — разбивает параметр, содержащий несколько значений, на список из единичных параметров. Эта подпрограмма предназначена для работы с элементами HTML, способными хранить несколько значений, — например, группой кнопок.
Начинаем документ HTML.Прежде всего, необходимо подключить пакет cgi-lib.pl. HTTP-заголовок ("Content-type: text/html\n\n") обычно генерируется функцией PrintHeader. Секции <HEAD> и <BODY> создает подпрограмма HtmlTop. Ее необязательный строковый аргумент используется в качестве названия Web-страницы и вставляется в начало страницы как заголовок первого уровня. Пример (lib1.pl):
#!/usr/local/bin/perl
require 'cgi-lib.pl';
print &PrintHeader;
print &HtmlTop ("CGI Example Using cgi-lib.pl");
Если для тега <BODY> требуется задать дополнительные атрибуты, их выводят вручную:
print "<BODY BGCOLOR=\ white\ LINK=\ red\><p>";
Подсказка. Конечно же, можно пропустить HtmlTop и создать собственные <HEAD> и <BODY>, выводя теги HTML со всеми необходимыми атрибутами.
Файл cgi-lib.pl не имеет специальных подпрограмм для создания разметки HTML, поэтому почти все, что требуется, приходится выводить вручную.
Читаем данные из элементов управления HTML.Для чтения данных из различных элементов управления в cgi-lib.pl предназначена подпрограмма ReadParse. Обычно создается хэш %in, с данными, полученными от элементов управления. Он адресуется по именам элементов. Например, в листинге 6-8 мы задавали текстовое поле с именем text. Вот как создается хэш %in и выводятся данные, полученные от элемента управления:
require 'cgi-lib.pl';
if (&ReadParse(*in)) {print "Your name is: ", $in{'text'}, "<p>";}
Обратите внимание: значение ReadParse проверяется до обращения к хэшу %in. Если ReadParse возвращает значение ложь, значит, получить данные не удалось.
Работаем с текстовыми областями.Содержимое текстовой области выводится так:
if (&ReadParse(*in)) {print "Your opinions are: ",
$in{'textarea'};};
Работаем с кнопками с независимой фиксацией.Когда данные группы кнопок будут переданы сценарию lib2.pl, $in('checkboxes') возвратит строку с несколькими значениями. Подпрограмма SplitParam пакета cgi-lib.pl делает из этой строки список:
if (&ReadParse(*in)) { print 'You use these products: ",
join(", ", &SplitParam($in{'checkboxes'}));}
Работаем со списками. Вот как lib2.pl читает и выводит на экран данные, выбранные пользователем из списка:
if (&ReadParse(*in)) {print "Your income level is: ",$in{'list'};}
Работаем с кнопками с зависимой фиксацией. Сценарий lib2.pl проверяет, какая кнопка была выбрана, и выводит ее значение:
if (&ReadParse(*in)) {print "Today is day", $in{'radios'};}
Работаем с раскрывающимися списками.Сценарий lib2.pl проверяет выбор пользователя и выводит его на экран:
if (&ReadParse(*in)) {print 'How much unsolicited mail you like:",
$in{ 'popupmenu'}, "<p>";}
Работаем со скрытыми полями данных.Вот часть кода lib2.pl, читающая текст из скрытого элемента управления и выводящая его на экран:
if (&ReadParse(*in)) {print "The hidden data is ",
$in{'hiddendata'};}
Завершаем документ HTML.Подпрограмма HtmlBot пакета cgi-lib.pl закрывает Web-страницу. Она возвращает строку "</BODY>\n</HTML>\n":
print &HtmlBot;
Часто эта строка оказывается последней в сценарии, как и в lib1.pl с lib2.pl.
Выводим все переменные.В этих примерах значения данных, переданных элементами управления HTML, выводились непосредственно оператором print. Но это можно сделать и проще: то же самое делает подпрограмма PrintVariables, но только в фиксированном формате. Например, можно заменить lib2.pl кодом, приведенным ниже:
Листинг 5.12. Вывод всех переменных.
#!/usr/local/bin/perl
#require 'cgi-lib рl';
use CGI qw/:ReadParse, PrintHeader, HtmlTop, HtmlBot, Vars/;
print &PrintHeader;
print &HtmlTop ("CGI Example Using cgi-lib.pl");
if (&ReadParse(*in)) { print &Vars; } print &HtmlBot;
Все данные, переданные lib2.pl, действительно есть, но не сопровождаются пояснительным текстом. PrintVariables полезна при отладке, но вряд ли нужна в завершенном проекте.
Примеры приложений.
Огромное количество CGI-сценариев на языке Perl уже доступно в Интернете и готово к использованию. Вот список нескольких полезных источников (проверяйте каждый такой сценарий на защищенность, а также на предмет наличия любых других проблем):
· архив Ясона (Jason's Perl Archive) — www.aquapal.co.uk/perl/perl.html;
· архив сценариев Мэтта (Matt's Script Archive) — www.worldwidemart.com/ scripts/;
· архив фирмы Yahoo! (Yahoo Perl Scripts) — dir.yahoo.com/Computers_And_-Internet/ProgrammingLanguages/Perl/Scripts/;
· страница ссылок и сценариев на Perl, принадлежащая Дэйлу Бьюли (Dale Bewley's Perl Scripts and Links), — www.bewley.net/perl/;
· страничка на www.perl.com, посвященная CGI, — reference.perl.com/query.cgi?cgi.
· русскоязычный сайт, посвященный Perl - www.perl.ru.
Когда вы начнете писать сценарии, которые делают больше, чем простенькие предыдущие, проблема защиты станет актуальной. Это одна из тем, которая будет обсуждаться далее.
Защита CGI.Обеспечение безопасности всегда было серьезной проблемой. В наши дни она еще более актуальна, так как но мере развития операционных систем становится все сложнее и сложнее затыкать бреши в защите. Поэтому на Unix-системах CGI-сценарии обычно запускаются от имени идентификатора пользователя "nobody" («никто»). Такой процесс имеет минимум привилегий. Считалось, что процесс, имеющий минимум привилегий, принесет меньше вреда. Однако и по сей день могут возникать проблемы — в частности, из-за неаккуратности в CGI-сценариях. Ниже рассказывается, как обойти некоторые наиболее вероятные неприятности.
Вот несколько Web-страниц, посвященных безопасности CGI, которые я рекомендовал бы прочитать до того, как вы начнете создавать для широкого использования что-либо серьезнее простейших CGI-сценариев:
страница WWW-консорциума, посвященная безопасности CGI (The World Wide Web Consortium's CGI security page), — www.w3.org/Security/Faq/ www-security-faq.html;
часть сборника вопросов и ответов (FAQ) по CGI-программированию на Perl, посвященная проблемам безопасности, - www.perl.com/CPAN-local/doc/ FAQs/cgi/perl-cgi-faq.html;
страничка Селены Сол (Selena Sol), рассказывающая, как вы рискуете при установке чужих сценариев — Stars.com/Authoring/Scripting/Sequrity;
Следующий шаг — непосредственное изучение кода. В примерах вы найдете информацию о безопасности и о том, как писать CGI-сценарии для счетчиков и гостевых книг.
Серьезно беремся за защиту.CGI-сценарии могут порождать множество потенциальных брешей в безопасности. В качестве предельного случая рассмотрим сценарий, запускающий программы, имена которых передаются ему в качестве аргумента. Данные форм HTML посылаются в виде строк, причем в качестве разделителя аргументов используется вопросительный знак. Строка данных записывается в конце URL, что означает, что если вы хотите просто запустить сценарий Perl, URL должен выглядеть, например, так:
http://www yourserver.com/user/perl.exe?script.pl
Но если хакер увидит, что вы используете технику вроде этой, он может послать собственную строку такого вида:
http://www.yourserver.com/user/perl.exe?-e+ nasty commands
В результате он сможет выполнить любые команды Perl, что вряд ли вас порадует. Этот пример указывает на одну из самых больших опасностей CGI-сценариев, написанных на Perl, — вызовы внешних программ без проверки кода, передаваемого в конце строки.
В Perl внешние программы вызываются многими способами, например с помощью строки, заключенной в обратные апострофы (backtics), вызовов system или ехес. Даже операторы eval требуют осторожного обращения. Очень важно настроить CGI так, чтобы нельзя было легко сделать ничего опасного. Хакеры собаку съели на использовании этого класса ошибок и CGI-сценариев для выполнения кода, нужного им.
На самом деле в Perl существует прекрасный механизм безопасности, предназначенный для латания дырок подобного типа, —меченые данные. Если разрешено отслеживание данных, Perl не позволяет передавать пришедшие извне данные функциям system, ехес и т. д. Простое правило, позволяющее обеспечить безопасность, — никогда не передавать непроверенные данные внешней программе и всегда стараться обойтись без запуска командной оболочки.
Если же это невозможно, следует всегда проверять аргументы на предмет наличия метасимволов командной оболочки и, по крайней мере, удаления их. Вот метасимволы командной оболочки Unix:
&;''\"*?`<>^(){}$\n\r
Еще одно важное замечание: не позволяйте другим перезаписывать ваши сценарии или файлы данных, неважно — случайно или намеренно. Другими словами будьте особенно внимательны к правам доступа к файлам, чтобы их нельзя было заместить.
И, конечно же, обычные ограничения: не посылайте пароли по электронной почте, не набирайте их при работе с бесплатными утилитами. He оставляйте ваш счет в системе (account) на долгое время неиспользуемым — хакеры следят за такими вещами, чтобы получить контроль над ними. Не позволяйте CGI-сценариям получать слишком много системной информации. И так далее, и тому подобное — большинство хакеров пролезут там, где вы и не думали.
Работаем с мечеными данными.Одной из самых больших дыр в защите CGI-сценариев является передача непроверенных данных командному интерпретатору. В Perl для предотвращения таких ситуаций можно использовать механизм меченых данных (tainted data). В этом случае любые переменные, связанные с данными, полученными извне (включая переменные среды, стандартный поток ввода и командную строку), считаются мечеными. Пока они остаются таковыми, их нельзя использовать для чего бы то ни было за пределами вашей программы. Если меченая переменная используется для установки другой переменной, последняя также становится меченой, что означает, что помеченные (или «запачканные») данные могут распространяться по программе сколь угодно далеко и сколь угодно сложными путями, но они все равно будут аккуратно помечены.
Подсказка.Этот механизм работает только для скалярных значений. Некоторые элементы массива могут быть мечеными, в то время как остальные — нет.
В общем, меченые данные не могут быть использованы при помощи вызовов eval, system, exec. Perl следит за тем, чтобы они не попали в команды, вызывающие оболочку, в команды, модифицирующие файлы, каталоги или процессы. Однако есть одно важное исключение: если вызовам system или eval передается список аргументов, он не проверяется на наличие меченых элементов. Если вы попробуете произвести какую-либо операцию с мечеными данными за пределами программы, Perl остановится с предупреждающим сообщением. В режиме меченых данных Perl прекращает работу также в случае вызова внешней программы без предварительной установки переменной среды PATH. В Perl версии 4 для включения отслеживания меченых данных используется специальная версия интерпретатора, называемая taintperl:
#!/usr/local/bin/taintperl
Однако в версии 5 проверка меченых данных включена в состав Perl, и вы можете включить ее, передав интерпретатору Perl ключ -T:
#!/usr/local/bin/perl -T
В следующем примере включается отслеживание меченых данных, но программа не делает ничего опасного — соответственно, проблем нет:
#!/usr/local/bin/perl -T
print "Hello!\n";
Однако при выполнении потенциально опасных операторов типа system при включенной проверке меченых данных Perl сообщит о возможной бреши в защите, обусловленной использованием данных окружения. Даже если вы не используете PATH при вызове внешней программы, не исключено, что его использует вызываемая программа. Вот сообщение об ошибке, которое вы увидите:
#!/usr/local/bin/perl -Т
print system( 'date');
Insecure $ENV(PATH) while running with -T switch at taint.pl
line 5, <> chunk 1
Чтобы исправить это, вы можете при включенной проверке меченых данных самостоятельно установить $ENV{'PATH'}:
#!/usr/local/bin/perl -T
$ENV{'PATH'} = '/bin:/usr/bin:/usr/1ocal/bin';
print system('date'),
Thu Nov 12 19-55 53 NSK
Вот еще пример, в котором делается попытка передать системному вызову меченые данные. Даже если $ENV{'PATH'} устанавливается в программе, сценарий все равно прекращает работу, так как пытается передать меченые данные оператору system:
#!/usr/local/bin/perl -T
$ENV{'PATH'} = /bin:/usr/bin:/usr/local/bin';
while(<>) {
$command = $_;
system($command); }
Insecure dependency in system while running with -T switch at taint.pl line 5, <> chunk 1
Данные, даже будучи переданными в $command из $_, все равно считаются мечеными. Как очистить данные, если вы уверены в них?
Очистка данных.Единственный способ очистить меченую переменную — использовать шаблоны, по которым из нее выбираются подстроки. В следующем примере предполагается, что меченая переменная $tainted содержит электронный адрес. Мы можем извлечь его и сохранить как не меченый в другой переменной следующим образом:
$tainted =~/(^[\w]+)\@(^[w]+)/
$username = $1;
$domain = $2;
print "$username\n",
print "$userdornain\n';
Таким образом, мы извлекли безопасные данные. То есть способ создания «чистых» данных заключается в извлечении из меченых данных подстрок, которые априори безопасны (и, конечно же, не содержат метасимволы командного интерпретатора).
Создаем счетчик посещений.Создание счетчика посещений — достаточно простая задача: вы просто должны хранить текущее значения счетчика в файле и показывать его при необходимости. Я приведу пример создания счетчика counter.pl.
Подсказка. Заметьте, что этот счетчик просто выводит текущее значение как текстовую строку, но в принципе можно сделать более интересные вещи, например, создать графический счетчик, имея набор файлов с изображениями цифр и выводя их один за другим на Web-странице. Можно также воспроизводить цифры с помощью тега HTML <IMG>, если установить атрибут SRC в соответствии с URL сценария, выводящего цифры.
Сценарий называется counter.pl, приведен он в листинге 6-12. Чтобы он работал, в том же каталоге, что и counter.pl, должен находиться файл counter.dat. Для начала отсчета запишите в counter.dat 0 (ноль) с помощью любого текстового
Листинг 5.13. counter.pl
#!/usr/bin/perl
use CGI;
$co = new CGI;
open (COUNT, "<counter.dat")
or die "Could not open counter data file!";
$count = <COUNT>;
close COUNT;
$count++;
open (COUNT, ">counter.dat");
print COUNT $count;
close COUNT;
$co->header,
$co->start_html(
-title=>'Counter Example' ,
-author=>'Andrew',
-BGCOLOR=>'white'),
$co->center($co->h1('Counter Example')), $co->p,
$co->center($co->h3("Current count ", $count)), $co->p,
$co->center($co->h3("Reload the page to update the count")),
$co->end_html;
Этот сценарий очень прост: все, что он делает, — это читает число, хранящееся в counter.dat, увеличивает его на единицу, записывает обратно в counter.dat и затем показывает увеличенный счетчик
Создаем гостевую книгу.Создание гостевой книги — шаг вперед по сравнению со счетчиком. Гостевая книга собирает комментарии пользователей и сохраняет их в файле, обычно имеющем формат HTML, чтобы затем выводить их на странице. Наша гостевая книга использует три файла, хранящихся в одном каталоге: guestbook.htm (листинг 6-14), guestbook.pl (листинг 6-15) и book.htm (листинг 6-16). Первый является лицом гостевой книги, то есть именно эта страница указывает пользователю, что он может добавить запись в книгу посетителей. Она получает имя пользователя и комментарий. Когда пользователь нажимает на кнопку подтверждения, данные посылаются сценарию guestbook.pl; иными словами, если вы используете этот сценарий, вам следует сменить указанный URL в guestbook.htm на реальный URL guestbook.pl:
<BODY><H1>Please add to my guestbook</H1>
<FORM METHOD=POST ACTION=
"http://www.yourself.com/cgi/guestbook.pl">
В guestbook.pl (см. листинг 6-15) мы открываем собственно гостевую книгу, хранящуюся в файле book.htm. Основная идея — добавить в нее имя пользователя и его комментарий, но book.htm заканчивается тегами </BODY></HTML>. Поэтому сначала надо установить указатель файла перед этими словами с помощью следующего кода:
open (BOOK, ">>book.htm") or die "Could not open guestbook!";
seek (BOOK, -lenght($co->end_html), 2);
Поскольку строки </BODY></HTML> в данном случае создаются с помощью CGI-метода end_html, мы откатываемся назад на длину генерируемой строки, что позволяет нам не зависеть от того, что метод end_html будет выводить в следующих версиях модуля CGI.pm.
После этого код записывает вместо тегов </BODY></HTML> новые данные, добавляя в конце те же теги вызовом CGI-метода end_html. Затем guestbook.pl создает страницу, на которой располагается благодарность пользователю за комментарии и гиперссылка, позволяющая просмотреть содержимое гостевой книги. Иными словами, если вы используете этот сценарий, вам следует сменить URL, приведенный в листинге, на реальный URL book.htm (убедившись, что права доступа для этого файла достаточно низки, чтобы guestbook.cgi мог записывать в него данные):
"If you whant to take a look at the guest book, "
$co->a({href=> "http://www.yourserver.com/cgi/book.htm"},
"click here"),".",
Если пользователь щелкает на гиперссылке, открывается гостевая книга, а ссылки на нее можно расположить на любой другой Web-странице вашего раздела. Имя пользователя и комментарии отображаются в гостевой книге вместе со временем добавления записи. Файл guestbook.pl приводит в безопасное состояние любой код HTML, который пользователь может попытаться ввести в гостевую книгу, замещая любые символы < HTML-кодом < (это делается так: $username =~ s/</< и $text =~ s/</<), который выводит "<", чтобы не позволять броузеру пытаться разобрать комментарии пользователя как HTML. Это означает, что любой код HTML, который пользователь попытается ввести в гостевую книгу, будет выведен как текст и не будет исполняться.
Заметьте, что вы можете настроить guestbook.pl так, чтобы он принимал электронные адреса посетителей (впрочем, все больше и больше пользователей не желают оставлять свои адреса не столько из соображений секретности, сколько из-за программ, которые сканируют сеть в поисках адресов электронной почты, а затем продают полученные списки распространителям рекламы). Вы также можете видоизменить файл гостевой книги book.htm, добавив графику с по мощью тега HTML <IMG>, установив фоновое изображение и т. д. Просто следите, чтобы последним, что вы выводите в book.htm был текст </BODY></HTML> (или вывод текущей версии CGI-метода end_html, поскольку в новой версии пакета CGI.pm он может смениться), чтобы guestbook.pl мог откатиться на необходимое число символов и заменить эти теги новым комментарием.
Подсказка. Если вы не хотите зависеть от версии модуля CGI.pl, записывайте в отдельный файл длину текста, выведенного методом end_html при последней записи в гостевую книгу и используйте для установки указателя это значение, а не длину строки, выводимой end_html.
Листинг 5.14. guestbook.htm
<HTML><HEAD><TITLE>Add to the guest book</TITLE></HEAD><BODY>
<Н1>Р1еаsе add to my guestbook</H1>
<FORM METHOD = POST ACTION =
http://www.yourself.com/cgi/guestbook.pl >
<BR><CENTER>Please enter your name<P>
<INPUT TYPE = "TEXT" NAME ="username"></INPUT>
<BR>Please enter your comments
<TEXTAREA ROWS = 8 COLS = 40 NAME = "comments">
</TEXTAREA><BR><BR>
<INPUT TYPE =SUBMIT VALUE =Send><INPUT type = RESET VALUE =Reset>
</CENTER></FORM>
</BODY></HTML>
Листинг 5.15. guestbook.pl
#!/usr/bin/perl
use CGI; $co = new CGI;
open (BOOK ">>book.htm") or die "Could not open guestBOOK";
seek (BOOK -lenght($co->end_html), 2)
$date = date; chop($date);
$username = $co->param("username"); $username =" s/<l</;
print BOOK,
$co->h3("New comments by :, $username, "on ",
$date,$co->p,$text,),
$co->hr, $co->end_html;
close BOOK;
print $co->header, $co->start_html(
-title=> "Guest Book Example" ,
-author=> "Andrew",
-BGCOLOR=> "white",
-LINK=> "red" );
$co->center($co->h1('Thanks for adding to the guest book!')),
"If you whant to take a look at the guest book, ",
$co->a({href=> http://www.yourserver.com/cgi/book.htm"},
" click here"),".",
$co->hr, $co->end_html;
Листинг 5.16. book.htm
<HTML><HEAD><TITLE>The Guest Book</TITLE></HEAD>
<BODY><CENTER>
<H1>Here is the guest book </H1><HR>
</BODY></HTML>
Теневые посылки (cookies).Создание и чтение теневой посылки (английское cookie, на современном новоязе именуемая также "кука", "кукис") стало популярным в Интернете - по крайней мере, среди Web-программистов. Под этим именем подразумевается использование протокола HTTP для хранения информации, полученной от сервера, на машине клиента и обмен этой информацией между компьютерами и программами-броузерами незаметно от пользователя, то есть в теневом режиме.
Теневые посылки и любимы и ненавидимы. Некоторые пользователи протестуют против получения и обработки теневых посылок на своих компьютерах и запрещают этот режим для своих броузеров. Поэтому приведенный ниже пример не активизирует их до тех пор, пока пользователь сам не введет данные для работы теневой посылки. Этот сценарий хранит данные в хеше, поэтому его легко подстроить для использования в других сценариях.
Использование теневых посылок.Многие пользователи терпеть не могут, когда на их компьютерах сохраняются мегабайты информации подобного рода. Мне приходилось видеть Web-страницу, на которой было более 70 теневых посылок. Это не столь безобидно как кажется. В большинстве броузеров верхний предел теневых посылок — число порядка 200. Поскольку теневые посылки позволяют отслеживать передвижение пользователей по разделам, а также хранить настройки пользователя, то теплые чувства к теневым посылкам иногда все же преобладают над раздражением.
Сценарий, приведенный в листинге 6-17, позволяет посетителю изменить страницу так, чтобы при следующих визитах она бы приветствовала ею по имени, а в день рождения еще и поздравляла бы. Этот сценарий вполне корректен — он не устанавливает никаких теневых посылок до тех пор, пока пользователь сам не предоставит или не обновит необходимую информацию. Сценарий проверяет данные, полученные от пользователя чтобы убедиться, что день рождения введен в формате месяц/день (mm/dd), содержит лишь цифры, а единственный символ / находится в нужном месте, и удаляет теги HTML, которые он мог ввести в строку для имени. Когда пользователь впервые открывает сценарий hellocookie.pl, он может настроить эту страницу, введя имя и цату рождения в формате mm/dd. После нажатия на кнопку подтверждения сценарий записывает информацию под именем greetings, сохраняя имя и день рождения, на компьютере клиента.
Когда пользователь снова открывает hellocookie.pl, сценарий проверяет, нет ли у посетителя теневой посылки greetings, и, если она есть, выводит приветствие, включая при необходимости поздравление с днем рождения. Вот и все.
Как записать теневую посылку.Записать теневую посылку с помощью CGI.pm несложно. В нашем примере она будет называться "greetings" и хранить информацию в хэше %greetings, уничтожая ее по истечении года:
Дата добавления: 2015-08-26; просмотров: 1513;