ГЛАВА 14
Информационная система фирмы "Два кирпича" — итоги и перспективы
Реализуя нашу систему, мы воспользовались всем спектром классических Интернет-технологий, связанных с Web. Если взглянуть на получившийся результат через призму практического использования, то можно увидеть достаточно много недостатков, которые относятся, прежде всего, к способам реализации поставленных задач. Первое, что сразу бросается в глаза, — это отсутствие дизайна как такового. Однако эта проблема легко устраняется, если создать некую концепцию оформления и внедрить ее с помощью таблиц стилей. Подробно использование таблиц стилей описано в гл. 6. Кроме того, наша система должна содержать информацию описательного характера о самой фирме и работе электронного магазина. Набор таких статических Web-страниц готовится с использованием классического языка HTML, описанного в той же гл. 6. Наконец, все формы для счетов должны базироваться на существующих стандартах бухгалтерских бланков, чтобы иметь лигитимность.
При устранении этих проблем и анализе системы с точки зрения безопасности (некоторые рекомендации на этот счет приведены в конце этой главы), она может быть реально внедрена.
Следует заметить, что при выборе способа передачи данных, введенных клиентом в форму, был использован достаточно искусственный метод — с помощью сокетов. Этот способ незаменим при создании собственных клиент-серверных решений, взаимодействие в которых не может обслуживать Web-сервер. Как правило, сокеты применяются при реализации сетевых прикладных программ, развертываемых как в масштабах локальных сетей, так и в сети Интернет. Этот способ отправки данных был выбран, чтобы продемонстрировать работу сокетов.
Разумеется, вам, скорее всего, придется создавать другие интерактивные элементы, возможно обогащенные множеством функций, но мы искренне надеемся, что знания, приобретенные во время прочтения книги, окажутся стартовой площадкой, с которой начнется ваше путешествие по фантастическим возможностям Интернет-программирования.
Элементы, которые можно было создать
В этом разделе речь пойдет о распространенных интерактивных элементах, которые часто служат украшением и хорошим дополнением к любому Web-ресурсу. Думаем, что во время чтения книги у вас, дорогой читатель, уже возникали идеи, как организован тот или иной Web-сервис, который встретился вам во время путешествий по Всемирной сети. Если идеи относительно реализации различных интерактивных элементов действительно возникали, то мы можем только радоваться оттого, что выполнили свою задачу, а если нет, то давайте сейчас вместе подумаем, как создать несколько распространенных интерактивных элементов.
Практически любой ресурс, который создается с расчетом на активную аудиторию, предполагает наличие гостевой книги. Ее размещение на сайте позволяет каждому посетителю оставить свои комментарии, высказать отношение к содержимому сайта и его создателям. Положительным моментом является получение обратной связи, что служит хорошим основанием для динамичного развития ресурса и чуткого реагирования на изменения настроения посетителей. Гостевые книги, с точки зрения пользователя, представляют собой список отзывов, с одной стороны, и страницы, предназначенные для отправки собственного отзыва, — с другой. С точки зрения программиста, это два связанных общими данными процесса (разумеется, не в терминологии Windows-программирования). С одной стороны, формируется база данных с клиентскими сообщениями, а с другой — динамически, на основе содержимого этой БД создается Web-страница, отсылаемая пользователям. Причем база данных может быть реализована по-разному. Трудно сказать, какой вариант лучше. Это может быть стандартная база с SQL-драйвером или простой текстовый файл, в который записываются все сообщения в формате, выбранном программистом. Кстати, в последнем случае можно воспользоваться языком XML для идентификации записываемых сообщений, а также их параметров, как то: имя автора, тема, дата и время оставления сообщения. Как альтернатива указанным способам хранения информации, выступает вариант создания и сохранения Web-страниц непосредственно после отправки клиентом своего сообщения. Если эти страницы записывать в один каталог и создавать индексный файл, содержащий описательные характеристики сообщений, то при отображении материалов гостевой книги можно вообще обойтись без использования серверных модулей. Этот отдельный файл, сохраняемый в HTML-формате, содержит ссылки на конкретные документы сообщений, с указанием их темы и автора. При добавлении нового послания файл соответствующим образом модернизируется и создается новая Web-страница с текстом сообщения. Автору данной главы больше близок вариант с сохранением сообщений в базе данных и последующей SQL-выборкой из нее. Такой вариант предоставляет гибкие возможности по сортировке и удалению старых посланий.
Более усовершенствованным, по сравнению с гостевыми книгами, вариантом обмена мнениями являются форумы. В принципе, отличие последних заключается в способе именования сообщений. Если гостевая книга предусматривает простую возможность указания темы сообщения, то форум отличает иерархическое (древовидное) упорядочивание сообщений. Это значит, что каждому сообщению можно поместить ответ, и более того, просмотреть все комментарии к нему, если таковые имеются. В принципе, программирование форумов практически не отличается от создания гостевых книг. Единственное, что изменяется, — это способ индексации сообщений и их последующее отображение. В данном варианте публичного обмена мнениями нужно предусматривать возможность указания связанных сообщений. В этом случае, наиболее приемлемым способом хранения данных является использование XML-файла. При этом, та функциональная часть серверного модуля, которая дописывает новые сообщения, является промежуточным слоем между конечным XML-файлом, хранящимся на сервере, и данными, которые клиент ввел в поля формы. Вторая часть преобразует этот документ в HTML-содержимое. При этом получается достаточно гибкая система. Если нужно каким-либо образом изменить внешний вид форума, то достаточно скорректировать скрипт, выполняющий преобразование из XML в HTML. Формат хранения данных остается прежним. На самом деле, такой подход отделения самих данных от их визуального представления является доминирующим при проектировании информационных систем любого уровня. Особенно это касается Интернет-ориентированных информационных систем, т. е. систем, разворачиваемых и используемых посредством этой сети. Если вы ранее читали учебные материалы, посвященные языку HTML, и внимательно сравнили с ними гл. 6 этой книги, то наверняка обратили внимание на то, что здесь изложены только самые общие сведения об элементах. На самом деле, даже без использования каскадных таблиц стилей Web-странице можно придать неплохое оформление. Так, даже сейчас, поступают многие Web-дизайнеры, считающие себя профессионалами. Однако это устаревший подход. Он устарел по следующей причине: стратегия развития спецификации HTML такова, что превращает его в способ указания принадлежности данных функциональным элементам Web-страницы. Это значит, что, объявляя элемент "ячейка таблицы (TD)", мы просто указываем браузеру, как следует интерпретировать данные, следующие вслед за тегом. Ранние версии языка HTML также предлагали средства для указания — как эту ячейку отображать. Это неудобно, поскольку таким образом приходилось описывать все множество ячеек, вид которых должен отличаться от принятых по умолчанию в таблице. Это приходилось делать в случае статического формирования документа. Если же таблица генерируется динамически, то работа программиста возрастает многократно. Каждый раз, когда необходимо описать формирование таблицы, нужно вводить кроме кода, описывающего элементы, еще и его форматирование, что при сложном отображении очень трудоемко. Попыткой отделить содержимое HTML-файлов от их представления явилось внедрение каскадных таблиц стилей. Это позволяло не только расширить возможности графического представления документов, но и минимизировать избыточный код в Web-странице. Однако даже с использованием обогащенного CSS языка HTML трудно использовать его как базовый стандарт для хранения данных по причинам, рассмотренным в гл. 13.
Таким образом, автор данной главы считает, что лучший способ хранения данных форума — это использование XML-документов.
В отличие от форумов и гостевых книг, чаты являются более динамическими элементами, в том смысле, что предназначены для непрерывного пополнения содержимого списка сообщений и отображения его в браузерах всех участников. В принципе, Web-страница с чатом, как правило, состоит из нескольких фреймов, один из которых и представляет собой отображение всех сообщений, пришедших от посетителей чата. Система обновления этой страницы может реализовываться по-разному. Самый простой и надежный способ — это использование обычного обновления страницы. Изучив эту книгу, можно было прочитать об использовании HTTP-заголовка Refresh (Pull-метод). Кроме того, в языке JavaScript существует функция Reload, которая при использовании совместно с таймером позволяет добиваться периодичности обновления экрана.
Как и в случае с форумами и гостевыми книгами, использование CGI-модулей позволяет создавать так называемые "закрытые комнаты", доступ к сообщениям которых открыт только для зарегистрированных клиентов. Это позволяет вести приватную или деловую переписку между людьми, при этом она не доступна всем остальным пользователям сети Интернет.
В гл. /5 будет описана реализация чата путем создания не просто серверного модуля, а настоящего HTTP-сервера.
Web-интерфейс к службам электронной почты
В последнее время очень популярными стали сайты, предоставляющие клиентам возможность получения и отправки электронной почты посредством Web-интерфейса. В отличие от классической схемы работы электронной почты, когда имеется специальный почтовый сервер (возможно, размещенный на одной машине с Web-сервером, но использующий другой сетевой порт), а клиенты, используя специальное программное обеспечение (например, MS Outlook), скачивают на свой компьютер почту с ящиков на этом сервере или, наоборот, передают ее, с целью последующей отправки сервером адресату, в Web-почте используется другой механизм.
В Web-почте точно так же, как и в предыдущем варианте, имеется выделенный сервер для хранения, приема и отправки корреспонденции. Создание такого сервера — непростая задача, но перед рядовыми программистами, как правило, и не стоит цель написать такой сервер. Если необходимо создать Web-почту, то пользуются готовыми серверными решениями, и создают лишь интерфейсную часть, выполняющую роль среднего звена в клиент-серверном взаимодействии. Ее задача состоит во взаимодействии с конечными клиентами посредством обычных Web-страниц, с одной стороны, и почтовым сервером, по протоколам SMTP и РОРЗ — с другой.
В поставку Delphi входят компоненты, предназначенные для работы с почтовыми серверами. Подробно они описаны в приложении 1. Эти компоненты могут использоваться как в настольных почтовых приложениях, так и в серверных модулях, что позволяет достаточно просто создавать программы, на самом деле реализующие совсем непростые функции.
На некоторых крупных сайтах, которые, как правило, имеют круг постоянных посетителей, предлагается не только пользоваться ресурсом, но и настраивать его по своему вкусу. В качестве параметров настройки служат цветовые гаммы, используемые в оформлении ресурса, расположение и порядок меню и т. д. Одним словом, делается все, чтобы сделать работу с ресурсом удобной и приятной для посетителя. Такие схемы настроек могут сохраняться как в виде записей в базе данных ресурса — при наличии аутентификации, так и в cookie-файлах, хранимых на стороне клиента. Если необходимо реализовывать такую схему работы ресурса, то нужно сначала продумать все варианты разметки Web-страниц. Затем четко выделить все имеющие постоянный характер блоки содержимого или источников, откуда это содержимое черпается (запросы к базам данных). Создав все фрагменты кода, которые сформируют эти блоки, можно приступать к их компоновке на Web-странице. Для этого пишется соответствующий обработчик клиентских настроек, в результате работы которого формируется готовый HTML-документ.
Для удобного пользования ресурсом на многих сайтах предусмотрена возможность поиска документов, отвечающих нужным критериям. Одним из простых и эффективных вариантов является индексирование всех размещаемых на сайте документов. Заключается этот процесс в формировании БД со списком слов, имеющихся в различных разделах документа. Для оценки соответствия найденных документов вводят коэффициент релевантности. Это число, которое показывает, насколько найденный документ может удовлетворять истинным целям поиска. Поскольку системы анализа содержания документов находятся еще в зачаточном состоянии, то для облегчения индексации документов рекомендуется сохранять описание документа в переменных полях параметра МЕТА. Кроме описания, здесь может присутствовать и список ключевых слов, относящихся к данному документу (листинг 14.1).
Листинг 14.1. Использование тега <МЕТА> для сохранения информации о документе
<МЕТА name=Keywords согЛегЛ="Создание интерактивных Web-сайтов, серверные модули, сетевые программы, Delphi, Borland, Inprise">
<НЕТА name=Description content="Книга, посвященная созданию интерактивных Web-сайтов и всему, что с ними связано. Кроме того, здесь описаны технологии, используемые в сетевых программах">
Таким образом, индексируя документ, нужно в специальной базе данных сохранить следующие характеристики документа: адрес, заглавие, список ключевых слов, описание и, возможно, существительные, встречающиеся в самом теле документа.
Наиболее весомым, с точки зрения поиска, является заглавие. Затем следует описание и список ключевых слов. Наименьшую роль, при присвоении документу коэффициента релевантности, играет тело документа. Проиндексировав документы, можно выполнять поисковые запросы к базе данных. При этом коэффициент релевантности формируется по-разному, в зависимости от желания программиста, но, как правило, его максимальное значение равно единице. Есть поисковые системы, которые в случае попадания искомого слова в заглавии сразу присваивают документу коэффициент 0.5. Затем, если слово встречено в разделе Description или Keywords, то добавляют еще 0.2. При нахождении слова в теле документа— добавляется 0.1. Далее все эти числа суммируются, и получается конечное значение коэффициента. После завершения поиска результаты выстраиваются в список, по мере уменьшения этого числа.
Конкретные значения вкладов в суммарный коэффициент зависят от поисковой системы и могут изменяться.
Рекомендации к реализации описанных элементов
В принципе, все необходимые сведения для реализации перечисленных здесь элементов уже описаны (за исключением. работы с почтой, которая приведена в приложении Г). Поэтому, засучив рукава, можно смело браться за разработку практически любого проекта, базирующегося на технологии CGI. Получив необходимые знания об использовании технологий, нужно, прежде всего, правильно составить проект. Лучше всего сперва четко представить — как должна работать создаваемая система. Сначала имеет смысл обдумывать общие положения, а затем состыковывать их для получения целостной картины работы системы. После этого уже можно перемещаться к деталям. Очень полезно работать с диаграммами UML. Такая работа имеет смысл, когда выстраивается громоздкая, из-за большого количества выполняемых задач, система. В этом случае объекты, как правило, носят не столько реализационный, сколько функциональный характер. Поэтому и удобно пользоваться диаграммами классов, чтобы уже на этапе проектирования создать модель конечной системы.
Если создается проект, имеющий не столько логическую сложность, сколько трудоемкий в реализации, например, хороший чат, то имеет смысл представить или нарисовать Web-интерфейс, т. е. предполагаемый вид страниц. После того необходимо решить, какие элементы внешнего вида должны формироваться динамически, в зависимости от каких параметров, и самое главное — по каким правилам. Набор этих правил и формирует бизнес-логику системы. Не жалейте времени и сил на обдумывание бизнес-логики. Время, потраченное на этапе проектирования, с лихвой окупится при реализации. Поскольку основные средства создания программ с Web-интерфейсом были описаны в книге, вы смело можете внедрять в ваше представление о работе системы те или иные объекты Delphi. С самого начала, опираясь на инструментарий, подготовленный для вас фирмой, Inprise можно существенно сократить число операций, реализованных вручную.
После того как бизнес-логика системы полностью продумана и, возможно, зафиксирована с помощью диаграммы классов, наступает этап реализации.
Каждый программист начинает непосредственное программирование в соответствии со своими привычками, но всегда полезно использовать существующие наработки. В Delphi существует возможность поместить самостоятельно разработанные проекты в меню создания проектов. Это ускоряет разработку однотипных программ, поскольку программист сразу получает готовый шаблон для добавления новых решений и функций. Воспользоваться этой возможностью можно путем выбора меню Project | Add to Repository. В появившемся диалоговом окне нужно заполнить несколько свойств проекта, а также выбрать вкладку меню, где будет размещен новый шаблон.
Вообще говоря, процессы написания кода и его отладки тесно связаны между собой. Рекомендуется, приступая к созданию программ в новой предметной области, придерживаться следующего правила: лучше продумать методологию отладки еще до начала написания программы, чем потом переделывать ее заново. При работе с незнакомыми объектами очень часто возникает необходимость подсмотреть их описание. Для этого настоящая книга содержит приложение, в котором подробно описаны свойства и методы компонентов, специально предназначенных для Интернет-программирования. Общие советы по отладке приведены в гл. 11, поэтому мы не будем здесь на них останавливаться.
На протяжении всей книги мы реализовывали примеры, не заботясь о том, какие данные может вводить пользователь. В практических приложениях — это грубое, недопустимое нарушение всех правил безопасности. В настоящей книге, справедливо можете заметить вы, эти правила не были сформулированы. Действительно, это правда. Однажды, великий математик Пьер Ферма, записав условие теоремы на полях книги, дописал: "Я знаю чудесное доказательство этой теоремы. К сожалению, оно не может уместиться на полях этой книги." После этого математики в течение многих столетий пытались его найти. Мы не можем излагать даже основы сетевой безопасности в данной книге, поскольку эти вопросы настолько всеобъемлющи, тем более, когда речь идет о создании заведомо публичных ресурсов, что остальная информация могла бы просто потеряться в них. Несколько слов по этому вопросу все-таки надо сказать, нисколько не претендуя на полноту изложения.
Естественной чертой многих людей является игнорирование проблемы, пока она не затронет его лично. Точно так и один из авторов этой книги относился к вопросам безопасности до тех пор, пока однажды не стал замечать интересное поведение окна Соединение с Интернет в нижнем левом углу рабочего стола. Даже при закрытом браузере, оно показывало передачу данных. Предчувствия оказались обоснованными — через несколько дней было получено письмо от доброго хакера с сообщением, содержимое которого не хочется здесь прилагать. Факт остался фактом — компьютер изучили вдоль и поперек. Даже сейчас, через многие годы неприятное чувство сохранилось, хотя прямых материальных потерь и удалось избежать. Это был просто компьютер, периодически подключаемый по коммутируемому каналу (dial-up) к Интернету. Что же говорить о сайтах, день и ночь выставляемых на всеобщий показ? Угроза взлома возрастает в тысячи раз.
Многие компании, занимающиеся online-продажами, понесли огромные финансовые потери из-за неграмотно организованной работы. Более того, многие из них поставили под угрозу материальную безопасность своих клиентов. Это все слишком серьезно, чтобы рисковать и по-прежнему поверхностно относиться к хакерским атакам.
Другая крайность — это доминирование страха быть поверженным хакерами над креативным мышлением. Авторам в их практической деятельности приходилось сталкиваться со случаями, когда люди боялись пользоваться электронной почтой из-за страха "подсматривания" их корреспонденции. Не нужно этого бояться. Просто надо знать и непрерывно увеличивать свои знания в вопросах сетевой безопасности.
На ком лежит обязанность по предотвращению атак?
В фирмах, которые работают через Интернет, как правило, есть несколько должностей, так или иначе связанных с ведением сайта и поддержанием работоспособности сервера. Прежде всего, это системный администратор и программист, пишущий серверные модули. Ответственность за работу системы лежит сначала на них, а потом на всех остальных сотрудниках. Что касается администрирования ресурса, то здесь имеется множество книг на русском языке, где подробно описаны аспекты настройки серверной операционной системы и самого Web-сервера. Главное, не допустить следующих оплошностей:
У одного из авторов в практической деятельности был случай, когда он занимался разработкой сайта, размещенного на одном из крупнейших, в то время, белорусских серверов. Естественно, что ресурс поддерживали несколько системных администраторов, постоянно находящихся у консоли управления. И что вы думаете, однажды при попытке записи нового модуля было обнаружено, что сервер не потребовал ввода имени пользователя и пароля. Не поверив своим глазам, этот человек открыл другой FTP-каталог и записал в него файл с картинкой. Естественно, что об этом было сразу сообщено системному администратору, который незамедлительно закрыл доступ ко всем папкам пользователей этого сервера. Окажись на месте этого пользователя хакер или просто "шутник", он сразу бы отформатировал жесткий диск сервера, или, по крайней мере, вычистил все папки. Поэтому регулярно проверяйте состояние ваших папок, особенно предназначенных для FTP-доступа.
С точки зрения программиста, создающего серверные программы, главной задачей обеспечения безопасности является не допустить отклонений в поведении программы от запланированного. Излюбленным методом временного вывода сервера из строя является порождение исключительных ситуаций. При этом на экране сервера могут появляться приветливые сообщения от программ с красным крестиком. Хорошо, если у монитора находится администратор, и он вовремя отреагирует на это, закрыв доступ к сбойному модулю. А если он пошел, например, на обед, или хуже того — дело обстоит ночью? Значит, постепенно занимаемая память компьютера станет возрастать и, достигнув верхнего предела отведенной виртуальной памяти, компьютер просто зависнет. Нужно отметить, что если хакер заметил сбойный модуль, то, скорее всего, он запустит столько его экземпляров, сколько можно. К счастью, во избежание преднамеренных перегрузок сервера, существует ограничение на количество одновременных пользователей Web-сервера. Этот параметр указан в файле настройки сервера.
Нужно всегда помнить, что правильное программирование — это защищенное программирование. Чтобы ни на вводил клиент в форму, чтобы ни прислали вместо ожидаемых данных в скрытых элементах, все должно быть корректно обработано.
Фильтрация пользовательских данных позволяет защитить программу не только от возникновения исключительных ситуаций, но и от попыток реализовать непредусмотренный алгоритм работы серверных модулей. Например, если данные, присылаемые клиентом попадают в качестве параметров в SQL-команду, то их комбинация, подобранная специальным образом, может вызвать исключительную ситуацию уже на уровне ВОЕ. Всегда нужно проверять — не прислал ли клиент вместо ожидаемых данных HTML-теги. При их последующем отображении, в гостевых книгах и чатах они будут интерпретированы как код, что может испортить дизайн всей страницы.
Очень важным моментом представляется введение автоматической цензуры ненормативной лексики в ресурсах, предусматривающих возможность публичного общения. В этом случае обычно составляется список слов, куда, кстати, можно добавить и HTML-теги. После этого пришедшее от клиента сообщение проверяется на наличие в нем этих слов. Если хоть одно из данных слов найдено, то клиенту должно выдаваться сообщение о том, например, что его послание не может быть помещено в форум. В последующем можно клиентов с плохо зарекомендовавшими себя IP-адресами вообще не допускать к обмену мнениями. Этот метод отлавливания нарушителей путем сопоставления "плохому" клиенту его IP-адреса действенен только, если клиент имеет статический IP-адрес. В противном случае, бороться с нарушителями таким образом практически бесполезно.