Добавление встраиваемых 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>";
Предыдущий раздел: перейти