Алгоритм гостевой книги

Алгоритм работы этого приложения, представленного на компакт-диске в виде файла comments.pl, расположенного в папке \examples\05\02, предельно прост. Скрипт последовательно производит следующие действия:
? вывод начального блока HTML-кода генерируемой динамической страницы (строка 13) благодаря подпрограмме start описанной выше библиотеки _stdlib.pl;
? получение и разбор параметров, переданных при помощи веб-формы с предыдущего шага работы скрипта (строка 17) за счет использования подпрограммы recvquery_post библиотеки _stdlib.pl;
? добавление новой записи в файл comments.dat (строки 21—39) в случае, если все поля веб-формы были заполнены. Если ни одно из полей веб-формы не было заполнено, попытка добавить новую запись не производится. Если же веб-форма была заполнена лишь частично, выводится соответствующее сообщение;
? вывод записей, содержащихся в файле comments.dat (строки 47—69);
? вывод веб-формы (строки 73—79);
? вывод оконечного блока HTML-кода и завершение работы благодаря подпрограмме stop файла _stdlib.pl (строка 83).
Обсудим более подробно некоторые детали.
Веб-форма содержит три поля — многострочную текстовую область с именем comment (комментарий) и однострочные текстовые поля nick (ник, псевдоним) и email (адрес электронной почты). Обработчиком данных веб-формы назначен этот же самый скрипт comments.pl. Данные формы передаются при помощи метода POST, поскольку длина комментария не ограничивается.
Каждая запись, добавляемая в файл comments.dat, содержит в себе данные, переданные в указанных полях. Последней строкой каждой записи считается подпись, состоящая из ника, ссылки на адрес электронной почты соответствующего пользователя и даты/времени оставления сообщения (последняя строка сообщения определяется в строках 56—64). Каждая строка файла comments.dat при выводе представляется в виде абзаца; подписи к сообщениям выделяются особым образом — выключаются вправо, выделяются курсивом и обрамляются рамкой снизу.
При выводе происходит подсчет количества записей, содержащихся в файле comments.dat. Счетчиком выступает переменная $qty (строки 43, 59, 73).
Пользователям запрещено использовать теги HTML в сообщениях. Угловые скобки, использующиеся в тегах, заменяются соответствующими мнемоподстановками HTML (& — &amp;, < — &lt;, > — &gt;, строки 23—25, 87—94).
Примечание
Устойчивость веб-приложений к неосторожным действиям пользователя — один из важнейших критериев, отличающих профессиональные разработки от любительских. Еще стоит всегда иметь в виду, что «нестандартные» действия, не вписывающиеся в типовую схему работы приложения, могут быть не просто банальной неосторожностью, но и результатом злого умысла.
Все параметры, передаваемые скрипту пользователем, в особенности критичные, использующиеся в дальнейшей работе в функциях наподобие open(), необходимо подвергать проверке, причем возможно более жесткой и специфичной.
Везде, где есть хотя бы малейшая возможность угрозы безопасности, нужно стараться жертвовать либеральной идеей «все, что не запрещено, то разрешено» в пользу противоположного принципа «все, что не разрешено, то запрещено».
В нашем случае свободное использование HTML-тегов могло бы позволить злоумышленникам создавать собственные веб-формы, внедрять в состав генерируемой скриптом динамической страницы вредоносный JavaScript-код и т. д.
В строке 26 к содержимому многострочной текстовой области comment применяется дополнительное преобразование: из текста пользовательского комментария удаляются все символы CR, представленные escape-последовательностью \r. Постараюсь объяснить, зачем это нужно. В браузерах, работающих под управлением Windows, разделителем строк в многострочной текстовой области выступает последовательность символов CRLF, тогда как в браузерах, функционирующих под управлением UNIX, строки разделяются единственным символом LF, который в Perl кодируется escape-последовательностью \n. Интересен, однако, тот факт, что оператор print в Windows-версиях Perl упрямо выводит escape-последовательность \n (и даже аналогичную по смыслу escape-последовательность c явно указанным шестнадцатеричным кодом единственного символа — \x0A!) как пару символов CRLF, чего, разумеется, нет в реализациях Perl для UNIX. В результате, если посетитель сайта использует Windows, и скрипт тоже исполняется на Windows-машине, в файле данных нашей гостевой книги окажутся совсем уж странные разделители строк: CRCRLF. Если же скрипт функционирует на UNIX-сервере, а пользователь применяет Windows, в файл данных в качестве разделителей строк запишутся последовательности CRLF. В нашем случае это, конечно, не столь принципиально, но было бы, однако, неплохо, чтобы строки в текстовом файле разделялись последовательностями CRLF на Windows-машинах и единственным символом LF — на UNIX-машинах. Поэтому мы и удаляем лишние символы CR. Вообще говоря, путаница с символами перехода на новую строку на различных платформах и особенности обработки этих символов интерпретаторами Perl представляют собой существенную головную боль для CGI-программистов.
Дата и время, использующиеся в подписях к сообщениям, представляется в формате, привычном для русскоязычных пользователей. Для формирования даты/времени в нужном нам виде используется подпрограмма russian_date (строки 98—109).
Эта подпрограмма использует встроенную в Perl функцию localtime(), возвращающую массив данных о текущих дате/времени. Элементами этого массива (с соответствующими индексами) являются: 0 — секунды, 1 — минуты, 2 — часы, 3 — число, 4 — номер месяца (нумерация начинается с нуля), 5 — номер года (0 соответствует 1900-му году).
Плата за простоту программы — отсутствие возможности администрирования (чтобы удалить то или иное сообщение, нужно редактировать файл comments.dat вручную), отсутствие разбивки длинных лент комментариев на страницы. Тем не менее, наш простейший пример вполне работоспособен.
Для практики попробуйте модифицировать наш пример таким образом, чтобы записи добавлялись в файл comments.dat не в прямом, а в обратном хронологическом порядке (новые — сверху). Это довольно просто.


© 2008-2018 ОптимизацияВебСайтов.ру


Любое использование текстового и графического контента сайта без активной ссылки на источник не доскается.