Существуют два способа устранения подобных проблем. Первый заключается в использовании функции семейства exec()
вместо функции system()
или popen()
. Специальные символы интерпретатора команд (например, точка с запятой) не подвергаются обработке, если они присутствуют в списке аргументов функции exec()
. Естественно, при этом пропадают преимущества таких функций, как system()
и popen()
.
Второй способ — проверка строки на предмет "благонадежности". В случае сервера словарей следует убедиться в том, что слово содержит только буквы (для этого предназначена функция isalpha()
). Такое слово не представляет угрозы.
Глава 11
Демонстрационное Linux-приложение
В этой главе кусочки мозаики сложатся в единую композицию. Мы опишем и реализуем законченную Linux-программа, в которой объединятся многие рассмотренные в данной книге методики. Программа через протокол HTTP выдает информацию о системе, в которой она работает.
Демонстрационная программа является частью пакета мониторинга Linux-системы и предоставляет следующие возможности.
■ Программа реализует минимально необходимые функции Web-сервера. Локальные и удаленные клиенты получают доступ к системной информации, запрашивая Web-страницы у сервера по протоколу HTTP.
■ Программа не работает со статическими HTML-страницами. Все страницы динамически генерируются модулями, каждый из которых вычисляет итоговую информацию о какой-либо характеристике системы.
■ Все модули подключаются к серверу динамически, загружаясь из совместно используемых библиотек. Их можно добавлять, удалять и заменять по ходу работы сервера.
■ Для каждого запроса на подключение сервер создает дочерний процесс. Это позволяет серверу продолжать реагировать на запросы, а также защищает его от ошибок в модулях.
■ Серверу не требуются привилегии суперпользователя (он не работает с привилегированным портом). Это ограничивает его в доступе к системной информации.
Программу сопровождают четыре модуля, в которых иллюстрируются методики сбора системной информации. В модуле time
используется системный вызов gettimeofday()
. В модуле issue
применяются функции низкоуровневого ввода-вывода и системный вызов sendfile()
. В модуле diskfree
показано, как с помощью функций fork()
, exec()
и dup2()
выполнять команды в дочерних процессах. В модуле processes
продемонстрирована работа с файловой системой /proc
.
11.1.1. Существующие ограничения
Программа обладает многими функциональными возможностями, которые ожидаются от полноценного приложения. В частности, она имеет средства анализа командной строки и проверки ошибок. Одновременно с этим она немного упрощений, так как нам хотелось сделать ее понятнее и сосредоточить внимание читателей на представленных в книге методиках. При анализе программного кода помните о следующих ограничениях.
■ Мы не пытались создать полноценную реализацию протокола HTTP. Воплощены лишь те его функции, которые достаточны для организации взаимодействия Web-сервера и клиентов. В реальных приложениях используются готовые реализации Web-сервера. [36] Наиболее популярный Web-сервер с открытым кодом — сервер Apache (доступен на Web-узле www.apache.org ).
■ Программа не претендует на полную совместимость со спецификациями HTML ( http://www.w3.org/MarkUp/
). Она генерирует простые HTML-страницы, которые могут обрабатываться популярными Web-броузерами.
■ Сервер не настроен на максимальную производительность или минимальное потребление ресурсов. В частности, мы сознательно опустили код сетевой настройки, обычно имеющийся у Web-сервера. Рассмотрение этой темы выходит за рамки нашей книги.
■ Мы не пытаемся регулировать объем ресурсов (число процессов, объем используемой памяти), потребляемых сервером или его модулями. Многие многозадачные Web-серверы обслуживают запросы посредством фиксированного пула процессов, а не создают новый дочерний процесс для каждого соединения.
■ Всякий раз, когда поступает запрос, сервер загружает библиотеку с модулем, которая немедленно выгружается по окончании обработки запроса. Эффективнее было бы кэшировать загруженные модули.
Протокол HTTP
Протокол HTTP (Hypertext Transport Protocol) используется для организации взаимодействия Web-клиентов и серверов. Клиент подключается к серверу, устанавливая соединение с заранее известным портом (обычно его номер — 80). Запросы и заголовки HTTP представляются в виде обычного текста.
Читать дальше