Всех обитателей Сети можно разбить на несколько групп:
- простые посетители Web-ресурсов;
- владельцы этих ресурсов;
- владельцы серверов, на которых располагаются сами страницы;
- подлые хакеры (принадлежащие иногда к вышеперечисленным группам), мечтающие всем досадить.
Строго говоря, далее по тексту хакерами я назвал людей, которые ищут глюки в программном обеспечении и психологии человека. Не обязательно они делают что-то плохое. А под нарушением безопасности я понимал не только изменение главной страницы сайта на надпись «СайТ ХаКНуТ кРУтЫмИ ХаКерАмИ», но и действия, приводящие к унижению и потери уважения.
Простейший пример — оставить мат в гостевой книге. Вроде бы мелочи, но если владелец сайта вовремя не проконтролирует (уехал в отпуск), то запись увидят посетители, читающие книгу. Понятно, что хорошего в этом мало. Разве что запись представляет собой шедевр русского мата.
А ведь такое может сделать каждый, причем есть еще форумы, электронная почта, чаты. Как раз на днях я просматривал старые выпуски «Компьютерры» и нашел заметку про участие Ольги Дергуновой в чате. Такое впечатление, что сетевое хамство становится все большей нормой в интернетовской жизни... Впрочем, это тема для отдельной статьи, а пока рассмотрим более интересные вопросы.
Скорее всего, у вас есть домашняя страница или даже интересный для многих ресурс. В первом случае место для хранения информации легко найти, ведь существует большое число русских бесплатных серверов (Народ.Ру, Newmail.ru, by.ru). Однако со временем ваш сайт разрастется, и все чаще вам не будет хватать возможностей для реализации задумок: 50 мегабайт, кажущие в начале огромной величиной, быстро закончатся. Вам надоест переделывать каждый файл после изменения дизайна или смены адреса электронной почты. Вы с удивлением узнаете (хотя, наверное, сейчас уже все про это слышали), что можно не указывать длинные адреса типа http://mysite.server.ru/file.html, а просто писать file.html. Катастрофой будет момент, когда ваш сайт закроют из-за наличия несуществующих запрещенных материалов. Головной болью обернется временная недоступность сервера. Вам захочется иметь свой форум и чат, но стандартные бесплатные вас уже не будут устраивать. Вот тогда-то вы узнаете про всякие CGI, Perl, SSI, CSS. К огромнейшему сожалению окажется, что часть из перечисленного нельзя использовать простому смертному. Вы загоритесь мыслью заиметь домен второго уровня (эх, жалко, что первого нельзя) и получить неограниченный хостинг. В конце концов, вы найдете сервер, предоставляющий то, что нужно, на приемлемых для вас условиях. К этому времени вы уже будете уметь писать CGI-скрипты, и вот тут появляются новые проблемы.
Perl я выучил, когда готовился к экзамену в университете (если бы знал, что его поставят автоматом, то не скоро бы за этот язык взялся, а зря, потому что это «рулез форева»). Perl — превосходный язык для написания программ для сайта. Можно создать именно тот форум, гостевую, чат, счетчик, которые подходят именно вам. Свобода действий огромнейшая! Благо, что для языка дополнительных библиотек полно, можно и с реестром работать, и Windows-интерфейс использовать в страницах.
Фильтруй теги!
Но эта самая свобода обворачивается тем, что можно допустить непростительную ошибку. Писал я как-то чат. Хороший он вышел, не использовал Refresh, логи сообщений велись, шепот работал и т.д. И показалось мне, что неплохо будет, если пользователи смогут использовать в посылках HTML-теги. Естественно, только те пользователи, которым я или назначенные администраторы это позволят. Иначе очередной «продвинутый» сетевой хам напишет что-нибудь вроде <font size=10 color=yellow>HELLO!!!</font>. И это еще цветочки, а ведь есть <img src='...'> и инструкции <!--#SSI_директива="параметры"-->... Чтобы сильно не думать (ленивый я), достал толстую книжечку по Perl и взял из нее кусок кода, фильтрующий теги. Уже когда лег спать, вдруг осенило меня: не всегда это будет работать! Во-первых, не все теги фильтруются, во-вторых, ведь можно неправильно их писать, или писать правильно, но не закрывать. Попробовал - и действительно, если пользователь посылает в сообщении <b> и не закрывает его, то следующие записи уже выводятся жирным начертанием. Пришлось добавить проверку на открывающиеся и закрывающиеся теги и ограничить их использование только стандартными.
Фильтрацию тегов нужно делать не только в чатах, но вообще везде, где возможен вывод того, что ввел пользователь. Контролировать надо даже имя в анкете.
Идентификация
Теперь про идентификацию. Вы задумывались над тем, что происходит при вводе вашего имени и пароля? Естественно, ввод сравнивается с базой данных, а дальше? Почему ничего не спрашивается далее, ведь вы не можете зайти по адресу на вторую страницу — выкинет на главную. Весь трюк в том, что ваша идентификационная информация передается прямо в скрытых элементах формы. На простеньких чатах вы можете найти свое имя и пароль в теле HTML. Кодируется примерно так:
<input type='hidden' name='nick' value='Ваше имя'>
<input type='hidden' name='password' value='Ваш пароль'>
Любой человек, имеющий доступ к компьютеру, имеет возможность узнать это. Вы ходите в интернет-кафе? А в чат оттуда заходите? Кстати, иногда идентификационные данные передаются прямо в строке адреса. Не надо даже копаться в кэше броузера, достаточно глянуть на экран.
А на совсем простых чатах для идентификации хранится только имя. Десятилетним «хакерам» очень нравится сохранять страницу, задающую фреймовую структуру, на диск и менять имя. Выходило так, что вы внезапно начинали ругаться. Я знаю один из таких чатов, он пользовался большой популярностью (сейчас, правда, глюки убрали). На сайте «Территория взлома» как раз лежит статья «Как взломать HTML-чат». Остается только улыбнуться.
Чтобы не передавать имя с паролем, рекомендуется при входе пользователя выделять ему временный случайный идентификатор и дальше работать уже с ним. В HTML-файлах ссылки теперь будут ссылаться на http://server.ru/cgi-bin/chat.pl?id=Wfw999YsJBdJ. Через заданный промежуток времени, если от пользователя не получено подтверждения, что он висит на линии, идентификатор обнуляется и теряет силу. То же самое происходит после того, как вы жмете ссылку «Выход».
Иногда для удобства вводится несколько режимов входа: обычный и с чужого компьютера. Если вы уверены, что никто не подсмотрит ваш идентификатор, имя с паролем спросят только один раз. После этого можно прямо заходить по ссылке, указав идентификатор. Или просто вынесите ссылку на рабочий стол, а потом ее используйте.
Все бы хорошо, но несколько лет назад я придумал способ, позволяющий узнать идентификатор человека. Мне надо было, чтобы этот человек зашел ко мне на сайт, нажав на гиперссылку. Сильно не приходилось уговаривать, просто назывался как-то загадочно и вешал на ник ссылку на сайт (хорошие форумы и чаты позволяют это делать). Пользователь попадал ко мне на страницу, а на ней грузилась картинка счетчика. Кроме функций счетчика велась небольшая статистика (подробнее о возможностях счетчика см. статью «Мне в логах видно все...»). Из нее я узнавал, с какой страницы ко мне зашли. Как вы догадались, я получал именно http://server.ru/cgi-bin/chat.pl?id=Wfw999YsJBdJ. Когда рассказал об этом создателю одного отличного чата, он долго думал о способе защиты. Теперь перед переходом на чей-то сайт в новом окне запускается скрипт, производящий редирект.
Заметьте, в этом примере мое участие было минимальным, просто когда-то на глаза попала статистика. А что, если кто-то решит серьезно заняться вашим сайтом?
Гостевые
Скрипты на Perl помогают существенно сократить время. Иногда в неблаговидных целях. Вернемся к гостевым книгам. В них обычно допускается ввод имени, e-mail, адреса сайта и отзыва. «Гостевые» нынче растут как грибы. Зашел человек на сайт, ничего полезного не нашел — у него самого все гораздо круче, только вот обидно, что никто этого не замечает. Дай, думает человек, оставлю запись в гостевой: «Круто, но у меня еще круче», и укажу адрес своей страницы. Хотя бы один человек, да зайдет.
Страница 2>>