Впрочем, даже после этого мы не застрахованы, к примеру, от того, что Vasya, находясь в одной локальной сети с Petya, не установит там анализатор сетевого трафика и не подсмотрит всю критичную информацию. При более серьезном объекте атаки, чем гостевая книга или Web-чат, и последствия более серьезные – достаточно представить на их месте Web-магазин либо систему управления банковским счетом.
Приведенные примеры являются лишь одной стороной общей проблемы идентификации в Internet. Несмотря на то что среднестатистический пользователь оставляет в Сети массу сведений о себе, мы не можем быть уверенными в том, что два захода с одного и того же адреса принадлежат одному и тому же пользователю, и наоборот, что один и тот же пользователь не может зайти с разных адресов.
Все предлагаемые решения этой проблемы имеют те или иные недостатки:
1. Средства аутентификации пользователей, встроенные в серверы, являются наиболее очевидным решением. В IIS разграничение доступа осуществляется средствами файловой системы, в Apache защита ставится на уровне каталогов путем размещения в общем каталоге конфигурационного файла (в разделе
2. Очень часто используются самодельные механизмы аутентификации, хранящие, как показано выше, имя и пароль пользователя непосредственно в спрятанных полях формы. Недостаток тут тот же – возможность перехвата. Неплохим решением является предварительная шифровка пароля, привязанная к IP-адресу пользователя, что сокращает возможности перехвата, хотя и не исключает его. Именно эта схема была реализована в скриптах управления пользовательским счетом баннерной системы Russian Link Exchange, занимающейся показами рекламных заставок – баннеров – на Web-серверах, однако в начале февраля 1999 в ней была обнаружена неприятная особенность. Оказалось, что зашифрованный пароль привязывался только к IP-адресу, сам же пароль по оплошности программиста выпадал из поля зрения. В итоге каждый пользователь системы мог получить доступ к любому счету. Публикация этого факта на открытых списках рассылки привела к громкому скандалу в узких кругах и ряду инцидентов, связанных с неправомочным переводом показов с одного счета на другой. К чести администрации системы следует заметить, что ошибка была исправлена в течение считанных часов, а все пострадавшие получили свои показы назад.
3. Еще одно решение, когда после первого входа в систему генерируется некоторый случайный идентификатор пользователя, никак не связанный с его именем или паролем. Идентификатор запоминается в базе сервера и записывается все в то же скрытое поле формы. При очередном обращении клиента проверяется, был ли уже зарегистрирован этот пользователь. Для предотвращения накопления в базе уже отключившихся пользователей вводится некоторая задержка и счетчик времени для каждого пользователя, хранящий время последнего обращения. Если время ожидания очередного запроса превысило задержку, пользователь из базы удаляется. Естественно, при каждом запросе счетчик времени обновляется. Данный способ наиболее эффективен именно в ситуации идентификации, а не аутентификации.
4. Наиболее популярный и достаточно надежный на сегодня способ, практически исключающий хранение информации в полях формы, – использование при идентификации сочетания IP-адреса пользователя и идентификатора, хранящегося вместе с прочей информацией в cookies. Основная проблема тут в нескольких процентах посетителей, отключающих cookies. Поэтому главную роль здесь играет мотивация – такому пользователю должна быть предъявлена убедительная причина, чтобы он включил их поддержку обратно.
Итак, подключаясь к Internet или открывая свой Web-сервер, вы всегда идете на некоторый риск. Устранить его полностью невозможно, но в ваших силах постараться свести риск до разумного минимума и не стать главным его источником. Надеемся, что в этом вам помогут материалы настоящей главы.