Серьезно беремся за защиту.

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

http://www yourserver.com/user/perl.exe?script.pl

Но если хакер увидит, что вы используете технику вроде этой, он может послать собственную строку такого вида:

http://www.yourserver.com/user/perl.exe?-e+ nasty commands

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

В Perl внешние программы вызываются многими способами, например с помощью строки, заключенной в обратные апострофы (backtics), вызовов system или ехес. Даже операторы eval требуют осторожного обращения. Очень важно настроить CGI так, чтобы нельзя было легко сделать ничего опасного. Хакеры собаку съели на использовании этого класса ошибок и CGI-сценариев для выполнения кода, нужного им.

На самом деле в Perl существует прекрасный механизм безопасности, предназначенный для латания дырок подобного типа, —меченые данные. Если разрешено отслеживание данных, Perl не позволяет передавать пришедшие извне данные функциям system, ехес и т. д. Простое правило, позволяющее обеспечить безопасность, — никогда не передавать непроверенные данные внешней программе и всегда стараться обойтись без запуска командной оболочки.

Если же это невозможно, следует всегда проверять аргументы на предмет наличия метасимволов командной оболочки и, по крайней мере, удаления их. Вот метасимволы командной оболочки Unix:

&;''\"*?`<>^(){}$\n\r

Еще одно важное замечание: не позволяйте другим перезаписывать ваши сценарии или файлы данных, неважно — случайно или намеренно. Другими словами будьте особенно внимательны к правам доступа к файлам, чтобы их нельзя было заместить.

И, конечно же, обычные ограничения: не посылайте пароли по электронной почте, не набирайте их при работе с бесплатными утилитами. He оставляйте ваш счет в системе (account) на долгое время неиспользуемым — хакеры следят за такими вещами, чтобы получить контроль над ними. Не позволяйте CGI-сценариям получать слишком много системной информации. И так далее, и тому подобное — большинство хакеров пролезут там, где вы и не думали.

Работаем с мечеными данными.Одной из самых больших дыр в защите CGI-сценариев является передача непроверенных данных командному интерпретатору. В Perl для предотвращения таких ситуаций можно использовать механизм меченых данных (tainted data). В этом случае любые переменные, связанные с данными, полученными извне (включая переменные среды, стандартный поток ввода и командную строку), считаются мечеными. Пока они остаются таковыми, их нельзя использовать для чего бы то ни было за пределами вашей программы. Если меченая переменная используется для установки другой переменной, последняя также становится меченой, что означает, что помеченные (или «запачканные») данные могут распространяться по программе сколь угодно далеко и сколь угодно сложными путями, но они все равно будут аккуратно помечены.

Подсказка.Этот механизм работает только для скалярных значений. Некоторые элементы массива могут быть мечеными, в то время как остальные — нет.

В общем, меченые данные не могут быть использованы при помощи вызовов eval, system, exec. Perl следит за тем, чтобы они не попали в команды, вызывающие оболочку, в команды, модифицирующие файлы, каталоги или процессы. Однако есть одно важное исключение: если вызовам system или eval передается список аргументов, он не проверяется на наличие меченых элементов. Если вы попробуете произвести какую-либо операцию с мечеными данными за пределами программы, Perl остановится с предупреждающим сообщением. В ре­жиме меченых данных Perl прекращает работу также в случае вызова внешней программы без предварительной установки переменной среды PATH. В Perl версии 4 для включения отслеживания меченых данных используется специальная версия интерпретатора, называемая taintperl:

#!/usr/local/bin/taintperl

Однако в версии 5 проверка меченых данных включена в состав Perl, и вы можете включить ее, передав интерпретатору Perl ключ -T:

#!/usr/local/bin/perl -T

В следующем примере включается отслеживание меченых данных, но программа не делает ничего опасного — соответственно, проблем нет:

#!/usr/local/bin/perl -T

print "Hello!\n";

Однако при выполнении потенциально опасных операторов типа system при включенной проверке меченых данных Perl сообщит о возможной бреши в защите, обусловленной использованием данных окружения. Даже если вы не используете PATH при вызове внешней программы, не исключено, что его использует вызываемая программа. Вот сообщение об ошибке, которое вы увидите:

#!/usr/local/bin/perl -Т

print system( 'date');

Insecure $ENV(PATH) while running with -T switch at taint.pl

line 5, <> chunk 1

Чтобы исправить это, вы можете при включенной проверке меченых данных са­мостоятельно установить $ENV{'PATH'}:

#!/usr/local/bin/perl -T

$ENV{'PATH'} = '/bin:/usr/bin:/usr/1ocal/bin';

print system('date'),

Thu Nov 12 19-55 53 NSK

Вот еще пример, в котором делается попытка передать системному вызову меченые данные. Даже если $ENV{'PATH'} устанавливается в программе, сценарий все равно прекращает работу, так как пытается передать меченые данные оператору system:

#!/usr/local/bin/perl -T

$ENV{'PATH'} = /bin:/usr/bin:/usr/local/bin';

while(<>) {

$command = $_;

system($command); }

Insecure dependency in system while running with -T switch at taint.pl line 5, <> chunk 1

Данные, даже будучи переданными в $command из $_, все равно считаются мечеными. Как очистить данные, если вы уверены в них?

Очистка данных.Единственный способ очистить меченую переменную — использовать шаблоны, по которым из нее выбираются подстроки. В следующем примере предполагается, что меченая переменная $tainted содержит электронный адрес. Мы можем извлечь его и сохранить как не меченый в другой переменной следующим образом:

$tainted =~/(^[\w]+)\@(^[w]+)/

$username = $1;

$domain = $2;

print "$username\n",

print "$userdornain\n';

Таким образом, мы извлекли безопасные данные. То есть способ создания «чистых» данных заключается в извлечении из меченых данных подстрок, которые априори безопасны (и, конечно же, не содержат метасимволы командного интерпретатора).

Создаем счетчик посещений.Создание счетчика посещений — достаточно простая задача: вы просто должны хранить текущее значения счетчика в файле и показывать его при необходимости. Я приведу пример создания счетчика counter.pl.

Подсказка. Заметьте, что этот счетчик просто выводит текущее значение как тексто­вую строку, но в принципе можно сделать более интересные вещи, например, создать гра­фический счетчик, имея набор файлов с изображениями цифр и выводя их один за другим на Web-странице. Можно также воспроизводить цифры с помощью тега HTML <IMG>, если установить атрибут SRC в соответствии с URL сценария, выводящего цифры.

Сценарий называется counter.pl, приведен он в листинге 6-12. Чтобы он работал, в том же каталоге, что и counter.pl, должен находиться файл counter.dat. Для начала отсчета запишите в counter.dat 0 (ноль) с помощью любого текстового

Листинг 5.13. counter.pl

#!/usr/bin/perl

use CGI;

$co = new CGI;

open (COUNT, "<counter.dat")

or die "Could not open counter data file!";

$count = <COUNT>;

close COUNT;

$count++;

open (COUNT, ">counter.dat");

print COUNT $count;

close COUNT;

print

$co->header,

$co->start_html(

-title=>'Counter Example' ,

-author=>'Andrew',

-BGCOLOR=>'white'),

$co->center($co->h1('Counter Example')), $co->p,

$co->center($co->h3("Current count ", $count)), $co->p,

$co->center($co->h3("Reload the page to update the count")),

$co->end_html;

Этот сценарий очень прост: все, что он делает, — это читает число, хранящееся в counter.dat, увеличивает его на единицу, записывает обратно в counter.dat и затем показывает увеличенный счетчик

Создаем гостевую книгу.Создание гостевой книги — шаг вперед по сравнению со счетчиком. Гостевая книга собирает комментарии пользователей и сохраняет их в файле, обычно имеющем формат HTML, чтобы затем выводить их на странице. Наша гостевая книга использует три файла, хранящихся в одном каталоге: guestbook.htm (листинг 6-14), guestbook.pl (листинг 6-15) и book.htm (листинг 6-16). Первый является лицом гостевой книги, то есть именно эта страница указывает пользователю, что он может добавить запись в книгу посетителей. Она получает имя пользователя и комментарий. Когда пользователь нажимает на кнопку подтверждения, данные посылаются сценарию guestbook.pl; иными словами, если вы используете этот сценарий, вам следует сменить указанный URL в guestbook.htm на реальный URL guestbook.pl:

<BODY><H1>Please add to my guestbook</H1>

<FORM METHOD=POST ACTION=

"http://www.yourself.com/cgi/guestbook.pl">

В guestbook.pl (см. листинг 6-15) мы открываем собственно гостевую книгу, хранящуюся в файле book.htm. Основная идея — добавить в нее имя пользователя и его комментарий, но book.htm заканчивается тегами </BODY></HTML>. Поэтому сначала надо установить указатель файла перед этими словами с помощью следующего кода:

open (BOOK, ">>book.htm") or die "Could not open guestbook!";

seek (BOOK, -lenght($co->end_html), 2);

Поскольку строки </BODY></HTML> в данном случае создаются с помощью CGI-метода end_html, мы откатываемся назад на длину генерируемой строки, что позволяет нам не зависеть от того, что метод end_html будет выводить в следующих версиях модуля CGI.pm.

После этого код записывает вместо тегов </BODY></HTML> новые данные, добавляя в конце те же теги вызовом CGI-метода end_html. Затем guestbook.pl создает страницу, на которой располагается благодарность пользователю за комментарии и гиперссылка, позволя­ющая просмотреть содержимое гостевой книги. Иными словами, если вы используете этот сценарий, вам следует сменить URL, приведенный в листинге, на реальный URL book.htm (убедившись, что права доступа для этого файла достаточно низки, чтобы guestbook.cgi мог записывать в него данные):

"If you whant to take a look at the guest book, "

$co->a({href=> "http://www.yourserver.com/cgi/book.htm"},

"click here"),".",

Если пользователь щелкает на гиперссылке, открывается гостевая книга, а ссылки на нее можно расположить на любой другой Web-странице вашего раздела. Имя пользователя и комментарии отображаются в гостевой книге вместе со временем добавления записи. Файл guestbook.pl приводит в безопасное состояние любой код HTML, который пользователь может попытаться ввести в гостевую книгу, замещая любые символы < HTML-кодом &lt (это делается так: $username =~ s/</&lt и $text =~ s/</&lt), который выводит "<", чтобы не позволять броузеру пытаться разобрать комментарии пользователя как HTML. Это означает, что любой код HTML, который пользователь попытается ввести в гостевую книгу, будет выведен как текст и не будет исполняться.

Заметьте, что вы можете настроить guestbook.pl так, чтобы он принимал электронные адреса посетителей (впрочем, все больше и больше пользователей не желают оставлять свои адреса не столько из соображений секретности, сколько из-за программ, которые сканируют сеть в поисках адресов электронной почты, а затем продают полученные списки распространителям рекламы). Вы также можете видоизменить файл гостевой книги book.htm, добавив графику с по мощью тега HTML <IMG>, установив фоновое изображение и т. д. Просто следите, чтобы последним, что вы выводите в book.htm был текст </BODY></HTML> (или вывод текущей версии CGI-метода end_html, поскольку в новой версии пакета CGI.pm он может смениться), чтобы guestbook.pl мог откатиться на необходимое число символов и заменить эти теги новым комментарием.

Подсказка. Если вы не хотите зависеть от версии модуля CGI.pl, записывайте в отдельный файл длину текста, выведенного методом end_html при последней записи в гостевую книгу и используйте для установки указателя это значение, а не длину строки, выводимой end_html.

Guestbook.htm

<HTML><HEAD><TITLE>Add to the guest book</TITLE></HEAD><BODY>

<Н1>Р1еаsе add to my guestbook</H1>

<FORM METHOD = POST ACTION =

http://www.yourself.com/cgi/guestbook.pl >

<BR><CENTER>Please enter your name<P>

<INPUT TYPE = "TEXT" NAME ="username"></INPUT>

<BR>Please enter your comments

<TEXTAREA ROWS = 8 COLS = 40 NAME = "comments">

</TEXTAREA><BR><BR>

<INPUT TYPE =SUBMIT VALUE =Send><INPUT type = RESET VALUE =Reset>

</CENTER></FORM>

</BODY></HTML>

Листинг 5.15. guestbook.pl

#!/usr/bin/perl

use CGI; $co = new CGI;

open (BOOK ">>book.htm") or die "Could not open guestBOOK";

seek (BOOK -lenght($co->end_html), 2)

$date = date; chop($date);

$username = $co->param("username"); $username =" s/<l&lt/;

print BOOK,

$co->h3("New comments by :, $username, "on ",

$date,$co->p,$text,),

$co->hr, $co->end_html;

close BOOK;

print $co->header, $co->start_html(

-title=> "Guest Book Example" ,

-author=> "Andrew",

-BGCOLOR=> "white",

-LINK=> "red" );

print

$co->center($co->h1('Thanks for adding to the guest book!')),

"If you whant to take a look at the guest book, ",

$co->a({href=> http://www.yourserver.com/cgi/book.htm"},

" click here"),".",

$co->hr, $co->end_html;

Листинг 5.16. book.htm

<HTML><HEAD><TITLE>The Guest Book</TITLE></HEAD>

<BODY><CENTER>

<H1>Here is the guest book </H1><HR>

</BODY></HTML>

Теневые посылки (cookies).Создание и чтение теневой посылки (английское cookie, на современном новоязе именуемая также "кука", "кукис") стало популярным в Интернете - по крайней мере, среди Web-программистов. Под этим именем подразумевается использование протокола HTTP для хранения информации, полученной от сервера, на машине клиента и обмен этой информацией между компьютерами и программами-броузерами незаметно от пользователя, то есть в теневом режиме.

Теневые посылки и любимы и ненавидимы. Некоторые пользователи протестуют против получения и обработки теневых посылок на своих компьютерах и запрещают этот режим для своих броузеров. Поэтому приведенный ниже пример не активизирует их до тех пор, пока пользователь сам не введет данные для работы теневой посылки. Этот сценарий хранит данные в хеше, поэтому его легко подстроить для использования в других сценариях.

Использование теневых посылок.Многие пользователи терпеть не могут, когда на их компьютерах сохраняются мегабайты информации подобного рода. Мне приходилось видеть Web-страницу, на которой было более 70 теневых посылок. Это не столь безобидно как кажется. В большинстве броузеров верхний предел теневых посылок — число порядка 200. Поскольку теневые посылки позволяют отслеживать передвижение пользователей по разделам, а также хранить настройки пользователя, то теплые чувства к теневым посылкам иногда все же преобладают над раздражением.

Сценарий, приведенный в листинге 6-17, позволяет посетителю изменить страницу так, чтобы при следующих визитах она бы приветствовала ею по имени, а в день рождения еще и поздравляла бы. Этот сценарий вполне корректен — он не устанавливает никаких теневых посылок до тех пор, пока пользователь сам не предоставит или не обновит необходимую информацию. Сценарий проверяет данные, полученные от пользователя чтобы убедиться, что день рождения введен в формате месяц/день (mm/dd), содержит лишь цифры, а единственный символ / находится в нужном месте, и удаляет теги HTML, которые он мог ввести в строку для имени. Когда пользователь впервые открывает сценарий hellocookie.pl, он может настроить эту страницу, введя имя и цату рождения в формате mm/dd. После нажатия на кнопку подтверждения сценарий записывает информацию под именем greetings, сохраняя имя и день рождения, на компьютере клиента.

Когда пользователь снова открывает hellocookie.pl, сценарий проверяет, нет ли у посетителя теневой посылки greetings, и, если она есть, выводит приветствие, включая при необходимости поздравление с днем рождения. Вот и все.

Как записать теневую посылку.Записать теневую посылку с помощью CGI.pm несложно. В нашем примере она будет называться "greetings" и хранить информацию в хэше %greetings, уничтожая ее по истечении года:

$со = new CGI:

$greetingcookie = $co->cookie(

-name=>'greetings',

-value=>\%greetings,

-expires=>'+365d' );

print $co->header(-cookie=>$greetingcookie);

Заметьте, что для создания теневой посылки вы передаете ее в качестве именованного параметра CGI-методу header.

Как прочитать теневую посылку.Для чтения теневой посылки используется обычный CGI-метод, получающий в качестве параметра имя посылки. После этой операции можно использовать данные хэша %greetings:

$со = new CGI;

%greetings = $co->cookie('greeting');

print $greetings{'name'}

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

Листинг 5.17. Hellocookie.pl

#!/usr/bin/perl

use CGI;

$co = new CGI;

%greetings = $co->cookie('greeting');

if ($co->param('name')) {$greetings{'name'} =$co->param('name')}

print $greetings{'name'};

if ($co->param('birthday') )

=~ m/\d\d\/\d\d/)

{$greetings{'birthday'} = $co->param('birthday');}

($date, $month, $year) = (lockaltime)[3, 4, 5];

$date = join ("/", $month + 1, $day);

if(exists($greetings{'name'})) {

$greetingstring = "Hello ". $greetings{'name'};

$greetingstring .= ", happy birthday!" if ($date eq $greetings{'birthday'});

$greetingstring =~ s/</&lt/;

$promt = "If you want to change this page's settings,

just enter new data below.";

} else { $promt = "To have this page greet you next time,

enter your data below "; }

$greetingcookie = $co->cookie(

-name=>'greetings',

-value=>\%greetings,

-expires=>'+365d' );

if ($co->param('name') || $co->param('birthday')) {

print $co->header(-cookie=>$greetingcookie);

} else { print $co->header;}

print

$co->start_html(-title=>"Cookie Example",), $co->center(

$co->h1("Cookie Example"), $co->p, $co->h1("$greetingstring"),

$promt, $co->startform, "Your name: ",

$co->textfield(

-name=>'name',

-default=>'',

-override=>1 ), $co->p,

"Your birthday (mm/dd): ", $co->textfield(

-name=>'birthday',

-default=>'',

-override=>1

),

$co->p, $co->submit, $co->reset,

$co->endform), $co->end_html;

Доступ к базам данных.

Язык программирования Perl превратился из инструмента, используемого преимущественно администраторами Unix-систем, в наиболее распространенную платформу разработки для World Wide Web. Perl не предназначался изначально для Web, но простота его использова­ния и мощные функции для работы с текстом сделали естественным его применение для CGI-программирования. Сходным образом, MySQL со своей высокой скоростью и широкми возможностями стала очень привлекательным средством для веб-разработчиков. Естественно поэтому, что был разработан интерфейс Perl к MySQL, объединив, таким образом их достоинства.

В настоящий момент существуют два интерфейса между Perl и MySQL. Более ранний состоит из специализированного интерфейса Mysql.pm. Другой, более новый интерфейс является подключаемым модулем в комплекте DBI (DataBase Independent) - независимых от базы данных модулей. DBI является попыткой обеспечить общий Perl API для доступа к любым базам данных и предоставления более высокой переносимости. Интерфейс DBI стал наиболее надежным и стандартным, и разработчики MySQL рекомендуют пользоваться только DBI, поскольку дальнейшая разработка модуля Mysql.pm прекращена. Однако многие унаследованные системы все еще используют их, поэтому мы расскажем здесь и о них.

DBI.Рекомендуемым методом доступа к базам данных MySQL из Perl является интерфейс DBD/DBI. DBD/DBI означает DataBase Dependent/DataBase Independent (Зависимый от базы данных/Независимый от базы данных). Название связано с двухъярусной реализацией интерфейса. В нижнем ярусе находится зависимый от базы данных уровень. На нем существуют свои модули для каждого типа базы данных, доступного из Perl. Поверх этого уровня находится независимый от базы данных уровень. Это тот интерфейс, которым вы пользуетесь при доступе к базе данных. Выгода такой схемы в том, что программисту нужно знать только один API уровня независимости от базы данных. Когда появляется новая база данных, кому-нибудь нужно лишь написать для нее модуль DBD (зависимый), и она станет доступна всем программистам, использующим DBD/DBI.

Как и в любом модуле Perl, для получения доступа нужно указать DBI в директиве use:

#!/usr/bin/perl -w

use strict;

use CGI qw(:standard);

use DBI;

При запуске программ Perl для MySQL/mSQL следует всегда задавать аргумент командной строки -w. Благодаря этому DBI будет перенаправлять все специфические для MySQL сообщения об ошибках на STDERR, и вы сможете увидеть ошибки, вызванные работой с базой данных, не прибегая к явной проверке их в программе.

Всякое взаимодействие между Perl, с одной стороны, и MySQL— с другой, производится с помощью объекта, известного как описатель базы данных (handle). Описатель базы данных (database handle) - это объект, представленный в Perl как скалярная ссылка и реализующий все методы, используемые для связи с базой данных. Одновременно можно открыть любое число описателей базы данных, ограничение накладывают только ресурсы системы. Метод connect() использует для создания описателя формат соединения DBI:ser­vertype:database:hostname:port (имя узла и порта необязательны), дополнительными аргументами служат имя пользователя и пароль:

my $dbh= DBI->connect( 'DBI:mysql:mydata ', undef, undef);

my $dbh = DBI->connect('DBI:mysql:mydata', 'me', 'mypass"};

Атрибут servertype является именем специфического для базы данных DBD-модуля, в нашем случае «mysql» (обратите внимание на точное использование регистра). В первом варианте создается соединение с сервером MySQL на локальной машине через сокет Unix. Это наиболее эффективный способ связи с базой данных, который должен использоваться при соединении на локальном сервере. Если указано имя узла, оно используется для соединения с сервером на этом узле через стандартный порт, если только не задан и номер порта. Если при соединении с сервером MySQL вы не указываете имя пользователя и пароль, то пользователь, выполняющий программу, должен обладать достаточными привилегиями в базе данных MySQL.

В Perl 5 используются два соглашения по вызову модулей. В объектно-ориентированном синтаксисе для ссылки на метод определенного класса используется символ стрелки «->» (как в DBI->connect). Другой метод - использование непрямого синтаксиса, в котором за именем метода следует имя класса, а затем - аргументы. В последнем примере метод connect следовало бы записать как connect DBI 'DBI:mysql:mydata', 'me', 'mypass'.

После соединения с сервером MySQL описатель базы данных - во всех примерах этого раздела $dbh - становится шлюзом к базе данных. Например, так готовится запрос SQL:

$dbh->prepare($query);

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

Для иллюстрации использования DBI рассмотрим следующие простые программы. В листинге 5.18 datashow.pl принимает в качестве параметра имя узла; при отсутствии параметра принимается имя «localhost». Затем программа выводит список всех баз данных, имеющихся на этом узле.

Листинг 5.18. Скрипт datashow.pl показывает базы данных, имеющиеся на сервере MySQL

#!/usr/bin/perl -w

use strict;

use CGI qw( standard);

use CGI Carp;

# Использовать модуль DBI use DBI CGI use_named_parameters(1),

my ($server, $sock, $host);

my $output = new CGI;

$server = param('server') or $server ="";

# Подготовить DBD-драйвер для MySQL

my $driver = DBI->install_driver('mysql');

my @databases = $driver->func($server '_ListDBs');

# Если параметр §databases не определен, # предполагаем, что на

# этом узле не запущен сервер MySQL Однако это может быть вызвано

# другими причинами Полный текст сообщения об ошибке

# можно получить проверив $DBI errmsg

if (not @databases) {

print header, start_html( title => Данные по $server , BGCOLOR => white ),

print <<END_OF_HTML, <H1>$server</h1>

Ha $server , по-видимому не запущен сервер mSQL </body></html> END_OF_HTML

exit(0)}

print header, start_html(title =>"Данные по $host", BGCOLOR => white),

print <<END_OF_HTML, <H1>$host</h1>

<P>Соединение с $host на сокете $sock<P>Базы данных <br><UL>

END_OF_HTML

foreach(@databases) {

print "<LI>$_\n";}

print << END_OF_HTML

</ul></body></html>

exit(0)

В листинге 5.19 tableshow.pl принимает в качестве параметров имя сервера базы данных (по умолчанию «localhost») и имя базы данных на этом сервере. Затем программа показывает все таблицы, имеющиеся в этой базе данных.

Листинг 5.19. Скрипт tableshow.pl выводит список всех таблиц в базе данных

#!/usr/bin/perl -w

use strict;

use CGI qw( standard);

use CGI Carp;

# Использовать модуль Msql.pm

use DBI;

CGI use_named_parameters(1);

my ($db);

my $output = new CGI;

$db = param( db ) or die( He указана база данных' );

# Connect to the requested server

my $dbh = DBI->connect( DBI mysql $db $server, undef, undef);

# Если не существует $dbh значит, попытка соединения с сервером

# базы данных не удалась Возможно, сервер не запущен,

# или не существует указанной базы данных

if (not $dbh) {

print header, start_html( title => Данные по $host => $db ,

BGCOLOR => white )

print <<END_OF_HTML <H1>$host</h1> <H2>$db</h2>

Попытка соединения не удалась по следующей причине <BR>

$DBI errstr </body></html> END_OF_HTML

exit(0) }

print header, start_html( title => Данные по $host => $db ,

BGCOLOR => white ), print <<END_OF_HTML,

<H1>$host</h1> <H2>$db</h2><р>

Таблицы:<br><UL>

END_OF_HTML

# $dbh->listtable возвращает массив таблиц,

# имеющихся в текущей базе данных.

my @tables = $dbh->func('_ListTables');

foreach (@tables) {

print "<LI>$_\n"; }

print <<END_OF_HTML; </ul>

</body></html> END_OF_HTML

exit(0);

И наконец, листинг 5.20 показывает, как вывести все сведения о некоторой таблице.








Дата добавления: 2015-11-04; просмотров: 1294;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.092 сек.