Поиск

Основные сведения по вопросам безопасности в Web

Перед тем как поместить CGI-программу на Web-сервер, вы должны осознать, что тем самым вы предоставляете удаленным пользователям, использующим Web-броузеры, ограниченный доступ к вашей системе. В случае обычных документов HTML пользователи могут лишь загрузить статические документы. При использовании CGI-программ они смогут запускать программы на Web-сервере.

Написание безопасных CGI-программ сохранит нервы вам и администратору Web-сервера. Создавать такие программы несложно, нужно лишь следовать некоторым правилам.

Открытый канал

При загрузке в броузер страницы с Web-сервера коды HTML пересылаются по обычному каналу в открытом виде (рис. 18.6). Это означает, что эти данные не кодируются, не шифруются и не скрываются каким-либо другим способом.

Данные, которые пользователь вводит при заполнении формы, передаются CGI-программе и пересылаются с использованием того же протокола, что и начальная Web-страница. Во время пересылки все поля формы открыты для всеобщего обозрения (рис. 18.7)

Пересылка данных в открытом виде — одна из основных проблем, на которые вы должны обратить особое внимание. Internet — далеко не безопасное место. Кто угодно может подключиться к кабелю, по которому пересылаются данные между сервером и броузером, и перехватить их.

Учитывая все вышесказанное, вы никогда не должны передавать следующие данные посредством обычных CGI-форм.

  • Любые пароли.
  • Личную информацию (номера карточек социального страхования, телефонные номера).
  • Финансовую информацию (номера счетов, PIN-коды, номера кредитных карточек).

Существует простое правило: никогда не пересылайте через Internet то, что нельзя смело доверить обыкновенной почтовой открытке.

"Стоп!"— скажете вы. "Я же неоднократно встречался в Internet с формами, запрашивающими подобную информацию. Уверялось, что это совершенно безопасно". Достаточно безопасные транзакции могут быть осуществлены в Web с использованием дополнительных средств. Безопасные Web-транзакции предусматривают полное кодирование диалога между сервером и броузером. Для этого используется безопасная версия протокола http, называемая https.
Проверка данных на безопасность

Другой важный момент, на который нужно обратить внимание при написании безопасных CGI-программ, — зависимость выполнения команд Perl от информации, присылаемой от формы. В Internet и, возможно, в вашей внутренней сети встречаются люди, которых хлебом не корми, дай им только возможность повредить ваш Web-сервер. Даже обычные пользователи случайно могут послать неправильные данные CGI-программе и тем самым вывести ее из строя.

Посмотрите на код HTML формы и на CGI-программу, которые приведены соответственно в листингах 18.3 и 18.4.

В листинге 18.3 приведен короткий код формы, которая запрашивает имя каталога и передает его программе directory.cgi. Программа directory.cgi получает имя каталога и подставляет его в системную команду Is -1, эквивалент которой в DOS — команда dir. Эти команды выводят содержимое указанного каталога.

Программа такого рода позволяет удаленным пользователям исследовать структуру каталогов. CGI-программа не проверяет допустимость вводимого имени каталога, и броузер получает возможность доступа к любым конфиденциальным данным.

Наиболее интересно то, что в переменной $directory может вообще находиться не имя каталога! Например, если в поле dirname ввести значение /home; cat/ets/passwd, то выполняемая CGI-программой системная команда будет иметь вид

Эта команда передаст копию файла системных паролей в Web-броузер. Фактически таким образом может быть запушена любая команда оболочки UNIX или MS-DOS. Если Web-сервер неправильно установлен и настроен, то это может сделать любой пользователь Internet.

В Perl имеется механизм, предотвращающий подобные вещи. Ключ -Т, указанный в строке, начинающейся с #!, включает режим контроля данных (data tainting). При этом данные, полученные из внешних источников (дескрипторов файлов, сетевых двунаправленных каналов, командной строки), помечаются как представляющие повышенную опасность. Помеченные таким образом данные нельзя использовать в системных вызовах, таких как open, функции system, системных командах и в других местах, чувствительных в смысле безопасности.

Функции open, system или оператор ' '. вообще нельзя использовать при включенном режиме контроля данных до тех пор, пока в программе явно не будет установлена переменная окружения PATH

В листинге 18.5 приведен код более безопасной версии программы directory.cgi.

Дополнительная информация по контролю данных и написанию безопасных программ на Perl содержится на странице persec электронного руководства, устанавливаемого вместе с Perl.
Невозможные события

Формы HTML/CGI могут вам доставить и другие неприятности. Посмотрите на фрагмент кода HTML, приведенный в листинге 18.6.

В этой форме максимально возможная длина поля color составляет 15 символов, не правда ли? Теоретически, да. Спецификация HTML утверждает, что атрибут length обозначает максимально допустимую длину поля. Но броузер может быть взломан, или злоумышленник модифицирует форму так, чтобы можно было вводить большее количество символов.

Если вам нужно, чтобы некоторое поле имело определенное значение или длину, не полагайтесь при проверке только на код HTML, Java или JavaScript. Например, если длина поля color не должна превышать 15 символов, используйте в CGI-программе на Perl подобный код:

Отказ от обслуживания

Любой Web-сервер может быть перефужен слишком большим количеством запросов, поступивших от удаленных пользователей. Иногда это происходит по злому умыслу, а иногда — нет. Часто бывает так, что компания размещает свои службы в Web и затем из-за перегруженности сервера большим количеством запросов оказывается вынуждена их свернуть.

Ситуация отказа от обслуживания может произойти и с обычными Web-страницами, и с CGI -программами.

Вы мало что можете сделать для предотвращения проблемы отказа от обслуживания. Мощности Web-сервера должны быть адекватны количеству пользователей. Если CGI-программа слишком долго выполняется или использует слишком большое количество системных ресурсов из-за частого доступа к файлам, интенсивного использования центрального процессора, сервер становится уязвим для атак, приводящих к отказу от обслуживания. Поэтому постарайтесь максимально уменьшить и упростить CGI-программу.