stringtranslate.com

Общий интерфейс шлюза

В вычислительной технике Common Gateway Interface ( CGI ) — это спецификация интерфейса, которая позволяет веб-серверам выполнять внешнюю программу для обработки пользовательских запросов HTTP или HTTPS . [1]

Такие программы часто пишутся на языке сценариев и обычно называются CGI-скриптами , но они могут включать в себя скомпилированные программы. [2]

Типичный вариант использования происходит, когда веб-пользователь отправляет веб-форму на веб-страницу, использующую CGI. Данные формы отправляются на веб-сервер в HTTP-запросе с URL-адресом , обозначающим CGI-скрипт. Затем веб-сервер запускает сценарий CGI в новом компьютерном процессе , передавая ему данные формы. Вывод сценария CGI, обычно в форме HTML , возвращается сценарием веб-серверу, а сервер передает его обратно браузеру в качестве ответа на запрос браузера. [3]

Разработанный в начале 1990-х годов, CGI был самым ранним доступным методом, позволяющим сделать веб-страницу интерактивной. В связи с необходимостью запускать CGI-скрипты в отдельном процессе каждый раз при поступлении запроса от клиента были разработаны различные альтернативы.

История

Официальный логотип CGI из анонса спецификации.

В 1993 году команда Национального центра суперкомпьютерных приложений (NCSA) написала спецификацию для вызова исполняемых файлов командной строки в списке рассылки www-talk. [4] [5] [6] Другие разработчики веб-серверов переняли его, и с тех пор он стал стандартом для веб-серверов. В ноябре 1997 года рабочая группа под председательством Кена Коара начала работу над более формальным определением компьютерной графики, данным NCSA. [7] Результатом этой работы стал RFC 3875, в котором указана версия CGI 1.1. В RFC особо упоминаются следующие участники: [3]

Исторически программы CGI часто писались с использованием языка программирования C. RFC 3875 «Общий интерфейс шлюза (CGI)» частично определяет CGI с использованием C, [3] говоря, что переменные среды «доступны с помощью процедуры библиотеки C getenv() или переменной environ».

Название CGI пришло из первых дней существования Интернета, когда веб-мастера хотели подключить устаревшие информационные системы, такие как базы данных, к своим веб-серверам. Программа CGI выполнялась сервером и обеспечивала общий «шлюз» между веб-сервером и устаревшей информационной системой.

Цель

Традиционно веб-сервер имеет каталог , который обозначается как коллекция документов, то есть набор файлов, которые можно отправлять в веб-браузеры, подключенные к серверу. [8] Например, если веб-сервер имеет полное доменное имя www.example.com , а его коллекция документов хранится /usr/local/apache/htdocs/в локальной файловой системе ( корневой каталог документов ), то веб-сервер ответит на запрос, http://www.example.com/index.htmlотправив браузер копию файла /usr/local/apache/htdocs/index.html(если он существует).

Для страниц, создаваемых «на лету», серверное программное обеспечение может откладывать запросы к отдельным программам и передавать результаты запрашивающему клиенту (обычно веб-браузеру, который отображает страницу конечному пользователю).

Такие программы обычно требуют указания некоторой дополнительной информации вместе с запросом, например строк запроса или файлов cookie . И наоборот, по возвращении сценарий должен предоставить всю информацию, необходимую HTTP для ответа на запрос: статус HTTP запроса, содержимое документа (если доступно), тип документа (например, HTML, PDF или обычный текст). и так далее.

Изначально не существовало стандартизированных методов обмена данными между браузером, HTTP-сервером, с которым он обменивался данными, и сценариями на сервере, которые должны были обрабатывать данные и в конечном итоге возвращать результат браузеру. В результате между различными вариантами HTTP-серверов существовала взаимная несовместимость, что подрывало переносимость скриптов .

Осознание этой проблемы привело к определению того, как должен осуществляться обмен данными, что привело к развитию CGI. Программы, генерирующие веб-страницы, вызываемые серверным программным обеспечением , которое соответствует спецификации CGI, известны как сценарии CGI , хотя на самом деле они могут быть написаны на языке без сценариев, таком как C.

Спецификация CGI была быстро принята и продолжает поддерживаться всеми известными пакетами HTTP-серверов, такими как Apache , Microsoft IIS и (с расширением) серверами на базе node.js.

Раннее использование сценариев CGI заключалось в обработке форм. В начале HTML формы HTML обычно имели атрибут «действие» и кнопку, обозначенную как кнопка «отправить». При нажатии кнопки отправки URI, указанный в атрибуте «действие», будет отправлен на сервер вместе с данными из формы, отправленными в виде строки запроса. Если в «действии» указан сценарий CGI, то сценарий CGI будет выполнен, а сценарий, в свою очередь, создаст HTML-страницу.

Развертывание

Веб-сервер, поддерживающий CGI, можно настроить для интерпретации URL-адреса , который он служит ссылкой на сценарий CGI. Общепринятым соглашением является наличие cgi-bin/ каталога в основании дерева каталогов и обработка всех исполняемых файлов в этом каталоге (и никаких других, в целях безопасности) как CGI-скриптов. Когда веб-браузер запрашивает URL-адрес, указывающий на файл в каталоге CGI (например, http://example.com/cgi-bin/printenv.pl/with/additional/path?and=a&query=string), то вместо того, чтобы просто отправлять этот файл ( /usr/local/apache/htdocs/cgi-bin/printenv.pl) в веб-браузер, HTTP-сервер запускает указанный сценарий и передает выходные данные сценария. в веб-браузер. То есть все, что сценарий отправляет на стандартный вывод, передается веб-клиенту, а не отображается в окне терминала, в котором запустился веб-сервер. Другое популярное соглашение — использование расширений имен файлов ; например, если сценариям CGI постоянно присваивается расширение .cgi, веб-сервер можно настроить на интерпретацию всех таких файлов как сценариев CGI. Хотя это удобно и требуется для многих готовых сценариев, оно открывает сервер для атаки, если удаленный пользователь может загрузить исполняемый код с соответствующим расширением.

Спецификация CGI определяет, как дополнительная информация, передаваемая вместе с запросом, передается сценарию. Веб-сервер создает подмножество переданных ему переменных среды и добавляет сведения, относящиеся к среде HTTP. Например, если косая черта и дополнительные имена каталогов добавляются к URL-адресу сразу после имени сценария (в этом примере ) /with/additional/path, то этот путь сохраняется в PATH_INFO переменной среды до вызова сценария. Если параметры передаются в сценарий через HTTP-запрос GET (к URL-адресу добавляется знак вопроса, за которым следуют пары параметр=значение; в примере ?and=a&query=string), то эти параметры сохраняются в QUERY_STRINGпеременной среды до вызова сценария. Тело HTTP-сообщения запроса , например параметры формы, отправленные через запрос HTTP POST , передаются на стандартный ввод сценария . Затем сценарий может прочитать эти переменные среды или данные из стандартного ввода и адаптироваться к запросу веб-браузера. [9]

Использование

CGI часто используется для обработки входной информации пользователя и получения соответствующего вывода. Примером программы CGI является реализация вики-файла . Если пользовательский агент запрашивает имя записи, веб-сервер выполняет программу CGI. Программа CGI извлекает источник страницы этой записи (если он существует), преобразует его в HTML и печатает результат. Веб-сервер получает выходные данные программы CGI и передает их пользовательскому агенту. Затем, если пользовательский агент нажимает кнопку «Редактировать страницу», программа CGI заполняет HTML textareaили другой элемент управления редактированием содержимым страницы. Наконец, если пользовательский агент нажимает кнопку «Опубликовать страницу», программа CGI преобразует обновленный HTML в исходный код страницы этой записи и сохраняет его.

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

Программы CGI по умолчанию запускаются в контексте безопасности веб-сервера. При первом представлении ряд примеров сценариев был предоставлен вместе со справочными дистрибутивами веб-серверов NCSA, Apache и CERN, чтобы показать, как можно закодировать сценарии оболочки или программы на языке C для использования нового CGI. Одним из таких примеров сценария была программа CGI под названием PHF, реализовавшая простую телефонную книгу.

Как и в ряде других сценариев того времени, в этом сценарии использовалась функция: escape_shell_cmd(). Предполагалось, что функция очистит свой аргумент, полученный от пользовательского ввода, а затем передаст его оболочке Unix для запуска в контексте безопасности веб-сервера. Сценарий неправильно очищал все входные данные и позволял передавать в оболочку новые строки, что фактически позволяло запускать несколько команд. Результаты этих команд затем отображались на веб-сервере. Если контекст безопасности веб-сервера позволяет это, злоумышленники могут выполнить вредоносные команды.

Это был первый широко распространенный пример нового типа веб-атаки, называемого внедрением кода , когда необработанные данные веб-пользователей могли привести к выполнению кода на веб-сервере. Поскольку пример кода был установлен по умолчанию, атаки были широко распространены и привели к появлению ряда рекомендаций по безопасности в начале 1996 года. [10]

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

Для каждого входящего HTTP-запроса веб-сервер создает новый процесс CGI для его обработки и уничтожает процесс CGI после обработки HTTP-запроса. Создание и уничтожение процесса может быть дорогостоящим: потреблять время ЦП и ресурсы памяти больше, чем фактическая работа по генерации выходных данных процесса, особенно когда программу CGI все еще необходимо интерпретировать виртуальной машиной. При большом количестве HTTP-запросов результирующая рабочая нагрузка может быстро перегрузить веб-сервер.

Вычислительные затраты , связанные с созданием и уничтожением процессов CGI, можно уменьшить с помощью следующих методов:

Оптимальная конфигурация любого веб-приложения зависит от особенностей приложения, объема трафика и сложности транзакции; эти компромиссы необходимо проанализировать, чтобы определить наилучшую реализацию для данной задачи и бюджета времени. Веб-фреймворки предлагают альтернативу использованию сценариев CGI для взаимодействия с пользовательскими агентами.

Смотрите также

Рекомендации

  1. ^ Робинсон <[email protected]>, Дэвид (2004). «Общий интерфейс шлюза (CGI) версии 1.1». www.tools.ietf.org . дои : 10.17487/RFC3875. Архивировано из оригинала 8 марта 2021 года . Проверено 16 февраля 2021 г.
  2. ^ Робинсон <[email protected]>, Дэвид (2004). «Общий интерфейс шлюза (CGI) версии 1.1». www.tools.ietf.org . дои : 10.17487/RFC3875. Архивировано из оригинала 11 февраля 2007 года . Проверено 16 февраля 2021 г.
  3. ^ abc Робинсон, Д.; Коар, К. (2004). «RFC3875: Общий интерфейс шлюза (CGI) версии 1.1». дои : 10.17487/RFC3875. Архивировано из оригинала 19 апреля 2021 года . Проверено 25 февраля 2012 г. {{cite journal}}: Требуется цитировать журнал |journal=( помощь )
  4. МакКул, Роб (14 ноября 1993 г.). «Серверные скрипты». www-talk (список рассылки) . Проверено 15 мая 2019 г.
  5. ^ «Общий интерфейс шлюза». hoohoo.ncsa.uiuc.edu . Национальный центр суперкомпьютерных приложений (NCSA). Архивировано из оригинала 27 января 2010 года.
  6. ^ «CGI: Общий интерфейс шлюза» . w3.org . Консорциум Всемирной паутины. Архивировано из оригинала 19 декабря 2009 года . Проверено 15 мая 2019 г.
  7. ^ «Страница проекта RFC общего интерфейса шлюза» . Архивировано из оригинала 25 августа 2013 года.
  8. ^ «Сопоставление URL-адресов с расположением файловой системы HTTP-сервера Apache версии 2.2» . Архивировано из оригинала 15 июля 2014 года . Проверено 16 июля 2014 г.
  9. ^ Нельсон, Энн Фулчер и Нельсон, Уильям Харрис Морхед. (2001). Построение электронной коммерции с помощью конструкций веб-баз данных. Бостон, Массачусетс: Эддисон Уэсли.
  10. ^ «Сценарий phf CGI не защищает от символов новой строки» . Координационный центр CERT Института программной инженерии . Архивировано из оригинала 28 июля 2020 года . Проверено 21 ноября 2019 г.
  11. ^ https://peps.python.org/pep-3333/

Внешние ссылки