Лабораторная работа 9

ДОСТУП К БАЗАМ ДАННЫХ ПОСРЕДСТВОМ CGI-СКРИПТА, НАПИСАННОГО НА ЯЗЫКЕ ESQL/C

Цель работы

Ознакомиться с основными понятиями разработки CGI-скриптов с целью написания простейших CGI-программ доступа к базам данных с использованием языка ESQL/C.

Содержание работы и методические указания к ее выполнению

Для выполнения работы необходимо

Общая схема доступа к базам данных с использованием CGI-скриптов имеет вид:

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

CGI-программа (CGI-скрипт) представляет собой программу локальной операционной системы сервера (в двоичном виде или в виде программы для интерпретатора), которая может быть вызвана из среды WWW. Для инициирования CGI достаточно, чтобы в URL-адресе был указан путь до запускаемой программы. Программное обеспечение WWW-сервера исполняет эту программу, передает ей входные параметры и возвращает результаты ее работы, как результат обработки запроса, клиенту.

С целью облегчения администрирования CGI-программ, а также для удовлетворения требованиям безопасности CGI-программы группируются в одном или нескольких явно указанных серверу каталогах. При выполнении лабораторной работы в качестве таких каталогов выступают каталоги cgi-bin в домашней директории пользователя или в директории public_html. При этом

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

  1. Адрес CGI-скрипта (программы-обработчика, расположенной на некотором сервере), которому будут пересылаться данные из формы. При этом выполняется пересылка не всей страницы целиком, а только значений, соответствующих элементам управления формы, которая инициировала запуск программы-обработчика.
  2. Метод передачи данных (наиболее применяемые POST и GET).
  3. Некоторый объект формы, при нажатии на который произойдет пересылка данных.

Форма задается в HTML-документе с помощью тега FORM. Все элементы управления находятся внутри контейнера <FORM>...</FORM>.

<FORM action="http://.......cgi" method="GET"|"POST"
      enctype="encodingType" name="formName" target="windowName"
      onSubmit="Handler">
	...	Поля формы	...

</FORM>

Среди атрибутов HTML-формы для целей CGI-программирования наиболее важны

Основными методами являются методы GET и POST. В зависимости от метода (GET или POST) данные формы будут помещены в переменную окружения QUERY_STRING или поданы на стандартный ввод STDIN. В случае метода GET, используемого по умолчанию, данные добавляются в конец URL-адреса и отделяются знаком "?". С помощью метода POST информация, введенная пользователем, посылается непосредственно в сценарий с помощью выходного потока сервера STDOUT и входного потока STDIN вашего сценария. Преимуществом использования метода POST является неограниченность длины передаваемого сообщения и безопасность передачи по сравнению с GET.

При нажатии некоторой кнопки на форме HTML документа происходит передача данных броузером серверу, на котором находится программа-обработчик данных. Основная работа такой программы заключается в:

Обработка CGI-скриптом данных формы составляет шаблонную часть скрипта.

Данные, веденные в форме, передаются CGI-модулю в виде последовательности символов через входной поток (метод POST) или переменную CGI-окружения (метод GET) в формате:

имя=значение&имя1=значение1&...&имяN=значениеN,

где имяi - значение параметра name из элемента HTML-формы, значениеi - введенное или выбранное значение независимо от его типа.

Алгоритм обработки передаваемой в CGI-скрипт строки данных состоит в разделении ее на пары имя=значение и декодирования каждой пары, учитывая, что все пробелы в введенных значениях в форме сервером были заменены символом "+" и символы с десятичным кодом больше 128 преобразованы в символ "%" и следующим за ним шестнадцатеричным кодом символа.

После шаблонной части CGI-скрипта следует содержательная часть, в которой можно анализировать полученные данные, обращаясь, при необходимости, к различным таблицам баз данных. При написании CGI-скрипта на языке ESQL/C работа с базой данных ведется средствами встроенного языка SQL и главных переменных, через которые передаются и возвращаются данные к серверу баз данных. Результаты обработки данных, полученных из базы данных, а также другие информационные сообщения передаются функцией printf() в выходной поток с учетом форматирования HTML-документа.

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

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

В том случае, когда любой пользователь без ограничений может иметь доступ к данным, предварительно средствами программы phpPgAdmin, либо средствами иного программного приложений владелец базы данных SQL-оператором

grant usage on schema schema-name to nobody

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

$Connect to 'database@server_name';

Обратите внимание, что в этом случае SEARCH_PATH будет nobody, public и в SQL-запросах идентифицировать таблицы нужно полным именем (имя schema-name.table-name).

После окончания работы с приложением владелец базы данных должен отобрать полномочия у пользователя nobody.

revoke usage on schema schema-name from nobody

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

$Connect to 'database@server_name' user 'name' using $parol;

Последовательность выполнения лабораторной работы

  1. Убедиться в наличии и заполненности базы данных поставщиков, деталей, изделий, поставок.
  2. Разработать и отладить HTML-формы для ввода данных пользователя согласно варианту задания.
  3. Средствами языка ESQL/C разработать и отладить CGI-скрипты для обработки данных HTML-формы и доступа к базе данных.
  4. После выполнения лабораторной работы привести базу данных в исходное состояние.

Требования к разрабатываемой программе

Разрабатываемые программы должна удовлетворять следующим требованиям:

  • разрабатываемое программное приложение должно содержать HTML-документ с формой для ввода данных и CGI-скрипт, вызываемый по окончании работы с HTML-формой;
  • CGI-скрипт должен быть написан на языке ESQL/C;
  • ввод параметров задания в HTML-форме может быть осуществлен либо путем ввода значений в текстовом виде, либо посредством выбора значений из предлагаемого списка;
  • программа должна быть написана в предположении, что любой пользователь без ограничений может иметь доступ к данным;
  • в программе должен быть предусмотрен вывод сообщений обо всех шагах ее выполнения, в том числе и о возможных ошибках;
  • все действия в отношении базы данных должны выполняться в рамках транзакций;
  • программа должна быть достаточно документирована.

Варианты заданий

Вариант 1

  1. Вывести информацию о поставщиках, поставивших детали для изделий из указанного города.
  2. Увеличить рейтинг поставщика, выполнившего наибольшую поставку некоторой детали, на указанную величину.

Вариант 2

  1. Вывести информацию о деталях, поставки которых были осуществлены для указанного изделия.
  2. Изменить цвет самой тяжелой детали на указанный.

Вариант 3

  1. Вывести информацию о поставщиках, которые осуществляли поставки деталей из заданного города в указанный период.
  2. Вставить поставщика с заданными параметрами.

Вариант 4

  1. Вывести информацию о поставщиках, поставивших указанную деталь в заданный период.
  2. Удалить поставщика, выполнившего меньше всего поставок.

Вариант 5

  1. Вывести информацию обо всех деталях, поставляемых для указанного изделия более чем одним поставщиком.
  2. В таблице поставок изменить номер поставщика при заданном номере детали и изделия.

Вариант 6

  1. Вывести информацию о деталях, поставки которых были осуществлены для указанного изделия всеми поставщиками.
  2. Увеличить рейтинг поставщика, выполнившего больший суммарный объем поставок, на указанную величину.

Вариант 7

  1. Вывести информацию об изделиях, для которых была поставлена указанная деталь.
  2. Изменить название и город детали с максимальным весом на указанные значения.

Вариант 8

  1. Вывести информацию о поставщиках, которые осуществляли поставки деталей для указанного изделия.
  2. Увеличить рейтинг поставщика, выполнившего большее число поставок, на указанную величину.

Контрольные вопросы

  1. Какова общая схема доступа к базам данных посредством CGI-скриптов?
  2. Каково назначение пустой строки, генерируемой CGI-скриптов?
  3. Каковы основные элементы HTML-формы?
  4. Каково назначение элемента action HTML-формы?
  5. В каком виде данные, введенные в форме, передаются CGI-модулю?
  6. В чем состоит особенность формата данных, передаваемых из HTML-формы CGI-модулю?
  7. Какова общая схема работы CGI-скрипта, вводящего данные посредством HTML-формы?
  8. В чем разница методов GET и POST?
  9. Как в CGI-скрипте задать системные переменные, определяющие параметры сервера базы данных?
  10. Каковы способы предоставления всем пользователям одинаковых полномочий на доступ к данным из CGI-скрипта?
  11. Каковы способы предоставления пользователям индивидуальных привилегий на доступ к данным из CGI-скрипта?
  12. В чем сильные и в чем слабые стороны CGI-технологии?