|
Программирование >> Программный интерфейс приложений
Сценарии, которые были запущены с Web-сервера, работают как пользователи Web-сервера. Это приводит к возникновению определенных проблем безопасности, так как теряется контроль над тем, что делает Web-cepBcp. Для этого в качестве владельца конфигурационного файла следует задать пользователя, который запускает Web-сервер (это может быть www или nobody или что-то вроде этого), и установить код доступа 400 или 600 с тем, чтобы никто другой не смог его прочитать. К сожалению, этот файл будет доступен для чтения любому, кто имеет право устанавливать сценарии для выполнения на Web-сервере. Все, что им надо сделать, - это записать сценарий, который явным образом открывает конфигурационный файл и отображает его содержимое на Web-странице. Так как его сценарий запущен под пользователем Web, он будет иметь все права на чтение файла. Поэтому может оказаться целесообразным создать пользователя MySQL, который имеет право только на чтение (SELECT) из базы sampdb. А затем поместить в конфигурационный файл базы данных samp db.cnf не свое собственное имя и пароль, а имя и пароль этого пользователя. Таким образом, можно избежать риска подключения сценариев к базе данных в качестве пользователя с правами модификации таблиц В главе 11, Общее администрирование MySQL , показано, каким образом создается учетная запись пользователя MySQL, который будет иметь ограниченные права. В качестве альтернативы можно настроить выполнение сценариев под управлением механизма suEXEC сервера Apache. Это позволит начать выполнение сценария под управлением привилегированного пользователя и указать сценарию получить параметры соединения из конфигурационного файла, права на чтение которого будут только у этого пользователя. Так. например, можно поступить со сценариями, которые должны иметь право на запись в базу данных. В качестве другого подхода можно привести создание сценария, который запрашивает имя и пароль пользователя с тем, чтобы использовать полученные значения для подключения к серверу MySQL. Такой метод лучше всего подходит для сценариев, которые предназначены для выполнения задач администрирования. В любом случае нужно хорошо понимать, что отдельные методы опроса имени и пароля пользователя являются предметом атаки любого взломщика, имеющего возможность установить дешифратор в сети между вами и сервером. Как понятно из всего предыдущего материала, безопасность Web-сервера может быть связана с большими проблемами. К сожалению, объем этой книги не позволяет уделить этой теме достаточно внимания. Можно начать с документации по безопасности сервера Apache. Кроме того, будет очень поучительно поинтересоваться вопросами и ответами по проблеме безопасности WWW, которые можно найти по адресу: http: WWW.W3.org/Security/Faq/ Броузер базы данных samp db Разработаем для нашего первого Web-приложения простейший сценарий - sampbrowse. В его функции будет входить получение перечня таблиц в базе данных sampdb и интерактивный просмотр содержимого любой из этих таблиц непосредственно с вашего Web-броузера. Сценарий sampbrowse работает следующим образом. Первый запуск сценария samp browse из вашего броузера подключает вас к MySQL-серверу и выбирает перечень таблиц базы данных samp db, затем он отсьшается на ваш броузер в виде страницы, на которой каждая таблица представлена в виде доступной гиперссылки. При выборе какой-либо таблицы броузер посылает запрос на Web-сервер сценарию sampbrowse на отображение содержимого этой таблицы. Если в момент запуска сценарий samp browse получает имя таблицы с Web-сервера, он выбирает содержимое таблицы и отображает полученную информацию на Web-броузере. Заголовок каждого столбца данных является именем столбца в таблице. Заголовки являются ссьшками, щелчок на которых задает сортировку по данному столбцу. Но необходимо вас предостеречь: таблицы базы данных sampdb относительно невелики, поэтому не составляет труда послать на ваш броузер содержимое всей таблицы. Но если отредактировать сценарий samp db для того, чтобы он мог отображать данные из самых различных баз данных, в которых могут встречаться таблицы достаточно большого размера, нужно будет подумать и о добавлении в операторы выборки предложения LIMIT. Создадим объект CGI в основном теле сценария sampbrowse и разместим начальную часть Web-страницы. Затем на основании параметра tblname рассмотрим, нужно ли отображать структуру определенной таблицы: ту ($cgi) = new CGI; # put out initial part of page my (Stitle) = Броузер базы данных $db name ; print $cgi->header (); print $cgi->start html (-title => $title); print $cgi->hl (Stitle); # параметры для поиска URL my ($tbl name) = $cgi->param ( tbl name ); my ($sort column) = $cgi->param ( sort column ); # если переменная $tbl name не имеет значения, # отображать перечень таблиц для выбора # в противном случае отобразить содержимое заданной таблицы, # если установлено значение $sort column. # сортировать по заданному столбцу. if (!$tbi name) display table list () else { display table ($tbl nanie, $sort column) ; print $cgi->end htnil () ; Процедура определения значения параметра, полученного от Web-сервера, максимально упрощена потому, что всю эту работу производит модуль CGl.pm. Достаточно вызвать метод paramO, указав имя параметра, который нас интересует. В сценарии samp browse это параметр tblname. Если он не определен или является пустым, то это первоначальная инициализация сценария. В таком случае сценарий отображает список таблиц. В противном случае отображается содержимое таблицы, указанной в параметре tbl name, отсортированной по содержимому столбца, имя которого указано в параметре sortcolumn. После отображения соответствующей информации делается вызов метода end html () для записи закрывающих тэгов формата HTML. Функция display table list О генерирует начальную страницу. Она делает выборку списка таблиц и выводит таблицу в формате HTML, состоящую из одного столбца, с именем таблицы базы данных в каждой ячейке. sub display table list { my (Sary ref, $url); print Для выбора таблицы щелкните на имени таблицы:<ВК><ВК>\п ; # ссылка на массив имен таблиц $ary ref = $dbh->selectcol arrayref (qq{ SHOW TABLES FROM $db name }); # отобразить таблицу в рамке print <TABLE BORDER>\n ; print <TR>\n ; display cell ( TH , Table Name , 1); print </TR>\n ; foreach my $tbl name (@($ary ref}) { $url = $cgi->script name (); $url .= sprintf ( ?tbl name=%s , $cgi->escape ($tbl name)); print <TR>\n ; display cell ( TD , $cgi->a {{-href => $url}, $tbl name), 0); print </TR>\n ; print </TABLE>\n ;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |