Открыть сервис

CGI-скрипты

CGI-скрипты (от англ. Common Gateway Interface — «общий шлюзовой интерфейс») — это программы, выполняемые на веб-сервере и предназначенные для генерации динамического содержимого веб-страниц в ответ на запросы пользователей. CGI-скрипты являются одним из первых и наиболее распространённых способов реализации интерактивности на веб-сайтах, позволяя серверу обрабатывать данные, введённые пользователем в формы, предоставлять доступ к базам данных, управлять сессиями и выполнять другие вычислительные задачи. В отличие от статических HTML-страниц, содержимое которых не изменяется, CGI-скрипты создают ответ на лету, что делает их основой для ранних веб-приложений, форумов, гостевых книг и счётчиков посещений.

Принцип работы

CGI-скрипт представляет собой исполняемый файл, написанный на одном из языков программирования (чаще всего Perl, C, C++, Python, Shell, Tcl). При поступлении HTTP-запроса от клиента (браузера) веб-сервер (например, Apache, Nginx, IIS) идентифицирует запрошенный ресурс как CGI-скрипт по его расширению (например, .cgi, .pl, .py) или расположению в специально отведённом каталоге (обычно cgi-bin). Вместо того чтобы отдать файл как есть, сервер запускает его как отдельный процесс операционной системы.

Взаимодействие с сервером

Сервер передаёт скрипту информацию о запросе через переменные окружения (environment variables). Ключевые переменные CGI:

  • REQUEST_METHOD — метод HTTP-запроса (GET, POST, HEAD и др.).
  • QUERY_STRING — строка запроса, передаваемая в URL после знака ? (для GET-запросов).
  • CONTENT_LENGTH — длина тела запроса (для POST-запросов).
  • CONTENT_TYPEMIME-тип данных, отправляемых в теле запроса (например, application/x-www-form-urlencoded).
  • HTTP_COOKIE — данные cookie, отправленные браузером.
  • REMOTE_ADDRIP-адрес клиента.
  • SERVER_NAME — доменное имя сервера.

Скрипт считывает эти переменные, обрабатывает их, выполняет необходимые вычисления (например, запись в базу данных, чтение файла, вычисление математической формулы) и выводит результат в стандартный поток вывода (stdout). Этот вывод должен быть отформатирован в соответствии с протоколом HTTP: сначала заголовки (например, Content-Type: text/html), затем пустая строка, а после — тело ответа (обычно HTML-код или перенаправление).

Пример простого CGI-скрипта на Perl

```perl

!/usr/bin/perl

use strict; use warnings;

print "Content-Type: text/html; charset=utf-8\n\n"; print "<html><head><title>Привет, мир!</title></head><body>"; print "<h1>Привет, мир!</h1>"; print "<p>Скрипт выполнен.</p>"; print "</body></html>"; ```

Этот скрипт, будучи размещённым в каталоге cgi-bin и имея права на выполнение, при обращении к нему через браузер выведет простую HTML-страницу. Для обработки данных формы (например, логина и пароля) скрипт должен разобрать QUERY_STRING (для GET) или прочитать тело запроса из stdin (для POST).

История

CGI был разработан в начале 1990-х годов сотрудниками Национального центра суперкомпьютерных приложений (NCSA) в рамках проекта веб-сервера NCSA HTTPd. Первая спецификация была опубликована в 1993 году. До появления CGI веб-серверы могли отдавать только статические файлы. CGI стал первым стандартизированным способом создания динамических веб-страниц, что позволило превратить Всемирную паутину из простого хранилища документов в интерактивную среду.

В середине 1990-х годов CGI стал основой для многих популярных веб-приложений, включая гостевые книги, счётчики посещений, форумы и первые интернет-магазины. Наиболее распространённым языком для написания CGI-скриптов в то время был Perl, благодаря своей мощи в обработке текста и регулярных выражений. Большую популярность приобрели такие библиотеки, как CGI.pm для Perl.

Преимущества и недостатки

Преимущества

  • Простота и универсальность: CGI-скрипты могут быть написаны практически на любом языке программирования, который поддерживает выполнение в виде отдельного процесса и работу со стандартными потоками ввода/вывода.
  • Изоляция: Каждый запрос обрабатывается отдельным процессом, что обеспечивает высокую надёжность — сбой в одном скрипте не влияет на работу сервера или других скриптов.
  • Безопасность (в определённой степени): Из-за изоляции процессов ошибки в скрипте редко приводят к краху всего сервера. Однако неправильно написанный скрипт может быть уязвим для атак (например, SQL-инъекций или внедрения команд).
  • Понятная модель: Разработчику не нужно разбираться в сложных внутренних механизмах сервера — достаточно знать, как читать переменные окружения и выводить данные.

Недостатки

  • Производительность: Для каждого HTTP-запроса сервер создаёт новый процесс, что требует значительных системных ресурсов (память, процессорное время). При высокой нагрузке это приводит к замедлению работы сервера и исчерпанию ресурсов.
  • Масштабируемость: Из-за накладных расходов на создание процессов CGI плохо подходит для сайтов с большим числом одновременных посетителей.
  • Отсутствие сохранения состояния: Каждый запрос обрабатывается независимо, что усложняет реализацию сессий и корзин покупок. Для поддержки состояния приходится использовать внешние механизмы (файлы, базы данных, cookie).
  • Ограниченная функциональность: CGI не предоставляет встроенных средств для работы с базами данных, сессиями или шаблонизацией — всё это разработчик должен реализовывать самостоятельно.

Применение

Несмотря на появление более производительных технологий (таких как FastCGI, SCGI, модули веб-серверов (mod_perl, mod_php, mod_python), серверные сценарии на PHP, ASP.NET, Java Servlets, Ruby on Rails, Node.js), CGI-скрипты продолжают использоваться в определённых нишах:

  • Простые задачи: Обработка форм обратной связи, отправка писем, простые счётчики.
  • Унаследованные системы: Многие старые веб-приложения, форумы и CMS (например, UBB.threads, некоторые версии Perl-форумов) до сих пор работают на CGI.
  • Образовательные цели: CGI часто используется в учебных курсах по веб-программированию для демонстрации основ взаимодействия клиента и сервера.
  • Встраиваемые системы: На устройствах с ограниченными ресурсами, где нецелесообразно устанавливать сложные интерпретаторы, CGI-скрипты на C или Shell могут быть единственным способом создания динамического контента.

Альтернативы

Основным недостатком CGI — созданием нового процесса на каждый запрос — призваны решить следующие технологии:

  • FastCGI: Протокол, при котором скрипт запускается один раз в виде долгоживущего процесса, а сервер общается с ним через сокет. Это значительно снижает накладные расходы. FastCGI поддерживается большинством современных веб-серверов.
  • SCGI: Упрощённый аналог FastCGI, использующий текстовый протокол.
  • Модули веб-серверов: Встраивание интерпретатора языка (например, PHP, Perl, Python) непосредственно в сервер (mod_php, mod_perl, mod_python). Это обеспечивает максимальную производительность, но снижает изоляцию и безопасность.
  • Серверные сценарии (PHP, ASP.NET, Ruby on Rails, Django): Современные фреймворки и языки, которые либо работают как модули, либо используют FastCGI, либо имеют собственные встроенные веб-серверы для разработки.

Безопасность

CGI-скрипты, особенно написанные на Perl или Shell, исторически были источником уязвимостей. Основные проблемы безопасности:

  • Внедрение команд (Command Injection): Если скрипт передаёт пользовательский ввод (например, имя файла) в системную команду без экранирования, злоумышленник может выполнить произвольные команды на сервере.
  • SQL-инъекции: При построении SQL-запросов с использованием непроверенных данных.
  • Раскрытие путей (Path Traversal): Если скрипт использует пользовательский ввод для указания пути к файлу, злоумышленник может получить доступ к файлам за пределами веб-корня.
  • Переполнение буфера: В скриптах на C или C++ при некорректной обработке входных данных.

Для минимизации рисков необходимо строго проверять и фильтровать все входные данные, использовать параметризованные запросы к базам данных, избегать вызова внешних команд с пользовательскими данными и устанавливать минимально необходимые права доступа к файлам и каталогам.

Современное состояние

К 2020-м годам CGI в значительной степени вытеснен из массового веб-хостинга более производительными и безопасными технологиями. Однако он остаётся важной исторической вехой в развитии Всемирной паутины. Многие хостинг-провайдеры до сих пор поддерживают CGI для совместимости со старыми скриптами. В операционных системах семейства Unix/Linux CGI-скрипты на Shell или Perl остаются популярным инструментом для быстрой автоматизации административных задач, выводимых в веб-интерфейс.

Источники

  • RFC 3875: The Common Gateway Interface (CGI) Version 1.1
  • Спецификация CGI от NCSA
  • Документация веб-сервера Apache HTTP Server (модуль mod_cgi)
  • Книга: «CGI Programming with Perl» by Scott Guelich, Shishir Gundavaram, and Gunther Birznieks (O'Reilly Media)
  • Статья «Common Gateway Interface» в английской Википедии

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →