Добавление встраиваемых HTTP сервисов и динамического контента во встраиваемые веб-приложения
Статья включает:
ЗОСРВ «Нейтрино» поставляется вместе с небольшим Web-сервером slinger, оптимизированным для работы со встраиваемыми приложениями. Поскольку этот Web-сервер поддерживает общий шлюзовый интерфейс (Common Gateway Interface, CGI) версии 1.1, стандарт HTTP 1.1 и динамический HTML (через команды SSI), то во встраиваемые приложения можно просто добавлять встраиваемые сервисы HTTP и динамическое содержание.
Например, можно написать приложение, которое управляет принтером и использует сервер slinger для обновления удаленного клиента, где отображаются данные о текущем состоянии принтера (рис. 1).
Перед запуском Web-сервера slinger и началом создания Web-страниц необходимо определить подходящую структуру каталогов и места для размещения файлов.
Обращайте особое внимание на место размещения файлов. Каталог для них (или каталоги) не должен быть доступен извне, иначе ваша система может подвергаться необоснованному риску. Например, не размещайте CGI-сценарии в том же каталоге, где находятся системные бинарные файлы, потому что тогда другие пользователи будут иметь возможность запустить любую команду на машине, которая поддерживает ваш Web-сервер. |
Для конфигурирования Web-сервера slinger используйте следующие переменные окружения:
/usr/local/httpd
; index.html
. Например, если в качестве значения HTTPD_ROOT_DOC определено имя index.html
, а в качестве значения HTTPD_ROOT_DIR определен каталог /usr/www
, то в качестве полного пути в Web-сервере slinger будет использоваться значение /usr/www/index.html
.
После принятия решения о структуре каталога до запуска сервера slinger нужно экспортировать указанные выше переменные окружения:
export HTTPD_ROOT_DIR=/usr/local/httpd export HTTPD_ROOT_DOC=index.html
Подробности об установке переменных окружения см. в разделе Настройка параметров окружения и оболочки.
Для запуска Web-сервера slinger нужно просто ввести команду:
slinger &
Web-сервер slinger работает поверх сокетов TCP. Поэтому должны быть запущены программы поддержки работы с сокетами, что означает необходимость запуска стека протокола TCP/IP. Подробности об этом см. в разделе Сетевой стек и протоколы TCP/IP.
Сервер slinger осуществляет прослушивание порта |
Во многих встраиваемых серверах при добавлении страниц пользователю приходится повторно соединяться с сервером, что является угрозой надежности, потому что программные коды поставщика и пользователя оказываются в разделяемом пространстве памяти. Несмотря на свой размер, сервер slinger предоставляет достаточно функциональных возможностей для поддержки доступа к динамически сгенерированным HTML-страницам через сценарии CGI или механизм SSI.
Встраиваемый Web-сервер предоставляет несколько путей создания динамических HTML-страниц:
Встраиваемый Web-сервер поддерживает интерфейс CGI (Common Gateway Interface) версии 1.1, который представляет собой удобное средство для управления динамическими данными. Недостатком CGI является то, что он ресурсоемок из-за использования фрагментов на языке интерпретируемого типа.
Если вы используете интерфейс CGI, то нужно решить, где располагать каталог cgi-bin
, в котором сохраняются CGI-сценарии.
Для настройки Web-сервера на использование интерфейса CGI необходимо применять переменную окружения HTTPD_SCRIPTALIAS, в которой указывается место расположения исполняемых файлов и CGI-сценариев, например:
export HTTPD_SCRIPTALIAS=/usr/www/cgi-bin
После определения переменной HTTPD_SCRIPTALIAS станет возможно запускать сценарии или процессы, которые размещаются в этом каталоге вашей машины. Поэтому убедитесь в том, что вы создали отдельный каталог для размещения сценариев. Если не будет определена переменная окружения HTTPD_SCRIPTALIAS, все функциональные возможности по работе со сценариями CGI будут отключены, а все запросы на исполнения этих сценариев будут приводить к ошибке.
Не используйте для каталога CGI-сценариев имена /bin или /usr/bin . Не размещайте в каталоге cgi-bin никаких значимых файлов, потому что они не будут защищены от воздействия со стороны того, кто использует Web-сервер.
Проверьте, чтобы файлы в каталоге |
Например, пусть для каталога в переменной окружения HTTPD_SCRIPTALIAS определено имя /usr/www/cgi-bin
. Если сервер slinger получит запрос на ресурс www.kpda.ru/cgi-bin/get_data.cgi/foo
, то будет выполнен найденный в каталоге /usr/www/cgi-bin
сценарий get_data.cgi
, а имя foo будет передано сценарию get_data.cgi
в качестве пути. Имя каталога foo сохраняется в переменной окружения PATH_INFO, и оно используется для передачи дополнительной информации о пути.
У сервера slinger существует несколько переменных окружения, которые используются в CGI-сценариях. Более подробно об этом см. в описании программы slinger.
SSI (Server Side Includes, вставки на стороне сервера) представляет собой разновидность командного языка, элементы которого могут встраиваться в HTML-файлы. С помощью SSI можно добавлять к HTML-странице динамическое содержание. Для передачи информации SSI-команде exec в сервере slinger используются переменные окружения PATH и CMD_INT. Просматривая динамические страницы HTML, клиенты могут использовать на своих Web-страницах в реальном времени интерактивные функции.
Клиенты могут создавать динамические HTML-страницы, помещая на них внутри кода HTML лексемы языка SSI. Лексема языка SSI включает в себя команду, управление которой осуществляет сервер slinger. При передаче HTML-кода сервер slinger заменяет лексему HTML-данными, основанными на теге, содержащемся в лексеме SSI.
Например, встраиваемый сервер может:
Для того чтобы лексемы языка SSI обрабатывались сервером slinger, HTML-файл должен иметь расширение .shtml
.
Теги языка SSI можно использовать для взаимодействия с сервером данных.
Синтаксис команд SSI
Далее приводится несколько примеров команд SSI, которые вы можете использовать в своих сценариях.
Управлять динамическими HTML-страницами можно также с использованием сервера данных (процесс ds). Сервер данных позволяет использовать многопоточные разделяемые данные, независимо от границ процессов. Поскольку встраиваемый Web-сервер поддерживает язык SSI, мы решили расширить его возможности, добавив взаимодействие с сервером данных.
Теперь можно запустить процесс, обновляющий сервер данных, касающихся состояния аппаратного устройства, в то время как встраиваемый Web-сервер получает независимый, но надежный доступ к информации об этом состоянии.
Более подробно о процессе сервера данных см. в описании программы ds. Там же приведен пример приложения, осуществляющего мониторинг устройства.
Когда вы выбираете каталог для хранения файлов данных, мы советуем вам соблюдать следующие рекомендации:
/usr/www
гораздо безопаснее, чем корневой каталог /
. Корневой каталог /
открывает для обслуживания сервером slinger всю вашу систему. При конфигурировании сервера slinger для поддержки работы с CGI-сценариями придерживайтесь таких рекомендаций:
/bin
или /usr/bin
;
root
), то не допускайте установку для CGI-сценария флага SUID
;
Не подвергайте необоснованному риску вашу машину. Проверьте, чтобы:
-2
), потому что под этим идентификатором запускается сервер slinger, а следовательно, он станет владельцем таких файлов. Данные рекомендации помогут избежать ситуации несанкционированной замены файла с паролем или Web-страниц.
Более подробно об этом см. в разделе Обеспечение безопасности системы.
Конфигурация
Мы порекомендовали размещать файлы ваших документов и сценариев в разных каталогах. В приводимом далее примере для документов отводится каталог /usr/local/httpd
, файл index.html
размещается в корневом каталоге, а для CGI-сценариев предназначается каталог /usr/www/cgi-bin
.
export HTTPD_ROOT_DIR=/usr/local/httpd export HTTPD_ROOT_DOC=index.html export HTTPD_SCRIPTALIAS=/usr/www/cgi-bin slinger &
В следующем примере показан неправильный способ задания конфигурации сервера slinger. При такой конфигурации возможна загрузка файлов со сценариями сторонним пользователем, поскольку документы и сценарии оказываются в одном и том же каталоге:
export HTTPD_ROOT_DIR=/usr/www export HTTPD_ROOT_DOC=index.html export HTTPD_SCRIPTALIAS=/usr/www slinger &
Для изменения конфигурации сервера slinger таким образом, чтобы была возможность работать с командами SSI и проводить отладку, используйте следующие команды:
export HTTPD_ROOT_DIR=/usr/local/httpd export HTTPD_ROOT_DOC=index.shtml export HTTPD_SCRIPTALIAS=/usr/www/cgi-bin slinger -des&
Сценарии
Далее приводятся два примера простого CGI-сценария, с помощью которого на Web-страницу выводится случайно выбираемое изображение. Один и тот же сценарий представлен на языках C и Perl, поэтому можно увидеть, как реализовать такую процедуру на любом из этих языков.
Исполняемую программу на С (rand_images.cgi
) и сценарий на языке Perl (rand_images.pl
) нужно поместить в каталог /usr/www/cgi-bin
. Используйте команду chmod, чтобы проверить установку кода прав доступа 755 для обоих файлов.
Выбираемые изображения размещаются в каталоге /usr/local/httpd/images
. Доступ к изображению со стороны Web-страницы происходит из локального каталога, в CGI-сценарии просто вычисляется, какое изображение нужно загрузить.
Для запуска сценария из Web-страницы используется следующий HTML-код с командами SSI:
<H2>Случайное изображение</H2> <P> Perl Script: <!--#exec cgi="rand_images.pl" --><BR> C Program: <!--#exec cgi="rand_images.cgi" --><BR>
Программа rand_images.с
Для компиляции этого приложения нужно выполнить команду:
cc -o rand_images.cgi rand_images.с
Листинг программы:
/* Данная программа генерирует случайное число и затем выбирает изображение в зависимости* от этого числа. В результате при каждой загрузке Web-страницы изображение меняется. */#include <stdio.h>#include <stdlib.h>#include <time.h>/* установка переменных */char *dir = "/images/";char *files[] = { "file1.jpg", "file2.jpg", "file3.jpg", "file4.jpg", "file5.jpg" };int num;int size;int main(){size = sizeof (files) / sizeof (files[0]);srand( (int)time( NULL ) );num = rand() % 4;/* Печать заголовка со случайным именем файла и базовым каталогом */printf( "<img src=\"%s%s\" alt=%s border=1 >\n<BR>", dir, files[num], files[num] );printf( "Location: %s%s\n\n<BR>",dir, files[num] );return (0);}
Скрипт rand_images.pl
#!/usr/bin/perl# Данный сценарий генерирует случайное число, а затем выбирает изображение в зависимости# от этого числа. В результате при каждой загрузке Web-страницы изображение меняется.# установка переменных$dir = "/images/";@files = ( "file1.jpg", "file2.jpg", "file3.jpg", "file4.jpg", "file5.jpg" );srand( time ˆ $$ );$num = rand( @files ); # Pick a Random Number# Печать заголовка со случайным именем файла и базовым каталогомprint "<img src=\"$dir$files[$num]\"alt=$files[$num] border=1 >\n<BR>";print "Location: $dir$files[$num]\n\n<BR>";
Предыдущий раздел: перейти