(Весьма короткое) Введение в то, как работает веб-сервер и как построить URI
Когда клиент запрашивает HTML файл, сервер посылает ему запрошенную страницу (или сообщение об ошибке). Браузер обрабатывает HTML код, чтобы отформатировать и отобразить файл. Например, введя URL (Uniform Request Locator - унифицированный указатель информационного ресурса) http://www.linuxdoc.org/HOWTO/HOWTO-INDEX/howtos.html, клиент подключается к серверу www.linuxdoc.org и запрашивает страницу /HOWTO/HOWTO-INDEX/howtos.html (такая ссылка называется URI - Uniform Resource Identifiers (универсальный идентификатор ресурса)), используя протокол HTTP. Если страница существует, сервер отсылает запрошенный файл. В такой статической модели, если файл присутствует на сервере, он посылается клиенту как есть, иначе посылается сообщение об ошибке (хорошо известное 404 - Not Found).
К сожалениию, такая модель не позволяет использовать интерактивность при работе с пользователем, что делает невозможным такие вещи, как e-бизнес, е-бронирование (билетов) на праздники и e-что_либо_еще.
К счастью есть решения как динамически генерировать HTML страницы. CGI (Common Gateway Interface - общий шлюзовой интерфейс) скрипты - одно из них. В этом случае URI для получения веб страниц строится немного по-другому:
Список аргументов сохраняется в переменной окружения QUERY_STRING. В данных обсотятельствах, CGI скрипт не более чем исполняемый файл. Он использует stdin (стандартный ввод) или переменную окружения QUERY_STRING, чтобы получить аргументы, переданные ему. После исполнения кода, результат выводится на stdout (стандартный вывод) и затем, передается веб-клиенту. Почти каждый язык программирования может быть использован для написания CGI скриптов (откомпилированная программа на C, Perl, скрипты shell и т.д.).
Для примера, давайте поищем в каких HOWTO на www.linuxdoc.org упоминается о ssh :
http://www.linuxdoc.org/cgi-bin/ldpsrch.cgi?svr=http%3A%2F%2Fwww.linuxdoc.org&srch=ssh&db=1&scope=0&rpt=20 Фактически, то что здесь написано гораздо проще, чем кажется. Проанализируем этот URL:
сервер - все тот же www.linuxdoc.org ;
запрашиваемый файл, GGI скрипт, называется /cgi-bin/ldpsrch.cgi ;
? - начало длинного списка аргументов:
srv=http%3A%2F%2Fwww.linuxdoc.org - это сервер, с которого поступил запрос;
srch=ssh содержит сам запрос, что искать;
db=1 означает, что поиск ведется только в HOWTO;
scope=0 означает, что поиск ведется в содержимом документа, а не только в его заголовке;
rpt=20 ограничивает до 20 количество найденных документов, отображаемых на странице.
Часто имена аргументов и их значения, дают представление для чего они предназначены. Более того, содержимое страницы с ответом еще лучше поясняет их назначение.
Теперь вы знаете, что лучшая сторона CGI скриптов - возможность пользователя передавать данные через аргументы... но худшая сторона - то что плохо написанный скрипт открывает дыру в безопасности.
Вы наверное заметили странные символы, которые использует ваш любимый браузер в предыдущем запросе. Эти символы закодированы в символьном наборе ISO 8859-1 (взгляните на >man iso_8859_1). В таблице 1 представлены значения некоторых из этих кодов. Вспомним, что в серверах IIS4.0 и IIS5.0 существует весьма опасная уязвимость, называемая unicode bug, основанная на представлении символов "/" и "\" в unicode.