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

редактировать
Интерфейс, который предлагает стандартный протокол для веб-серверов для выполнения программ install

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

Вкратце, запрос HTTP GET или POST от клиента может отправлять данные HTML-формы в программу CGI через стандартный ввод. Другие данные, такие как пути URL и данные заголовка HTTP, представлены как переменные среды процесса.

Содержание

  • 1 История
  • 2 Назначение спецификации CGI
  • 3 Использование сценариев CGI
  • 4 Пример
  • 5 Развертывание
  • 6 Использование
  • 7 Безопасность
  • 8 Альтернативы
  • 9 См. Также
  • 10 Ссылки
  • 11 Внешние ссылки

История

Официальный логотип CGI из объявления о спецификации

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

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

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

Цель спецификации CGI

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

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

Такие программы обычно требуют указания дополнительной информации в запросе. Например, если бы Википедия была реализована в виде сценария, сценарию нужно было бы знать одно: вошел ли пользователь в систему и, если вошел в систему, под каким именем. Содержимое вверху страницы Википедии зависит от этой информации.

HTTP позволяет браузерам передавать такую ​​информацию на веб-сервер, например как часть URL-адреса. Серверное программное обеспечение должно каким-то образом передать эту информацию сценарию.

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

Изначально различное серверное программное обеспечение могло использовать разные способы обмена этой информацией со скриптами. В результате было невозможно написать сценарии, которые работали бы без изменений для другого серверного программного обеспечения, даже если обмениваемая информация была одинаковой. Поэтому было решено указать способ обмена этой информацией: CGI (общий интерфейс шлюза, поскольку он определяет общий способ взаимодействия серверного программного обеспечения со сценариями). Программы создания веб-страниц, вызываемые серверным программным обеспечением, работающим в соответствии со спецификацией CGI, известны как сценарии CGI.

Эта спецификация была быстро принята и до сих пор поддерживается всем известным серверным программным обеспечением, таким как Apache, IIS и (с расширением) Серверы на основе node.js.

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

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

Веб-сервер позволяет своему владельцу настраивать, какие URL-адреса должны обрабатываться какими сценариями CGI.

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

Как отмечалось выше, спецификация CGI определяет, как дополнительная информация, переданная с запросом, передается в сценарий. Например, если косая черта и дополнительные имена каталогов добавляются к URL-адресу сразу после имени скрипта (в этом примере / with / additional / path), то этот путь сохраняется в PATH_INFOпеременная среды перед вызовом скрипта. Если параметры отправляются в сценарий через HTTP-запрос GET (к URL-адресу добавляется вопросительный знак, за которым следуют пары param = value; в примере, ? И = a query = string), то эти параметры сохраняются в переменной среды QUERY_STRINGдо вызова скрипта. Если параметры отправляются в сценарий через запрос HTTP POST, они передаются на стандартный ввод сценария. Затем сценарий может считывать эти переменные среды или данные из стандартного ввода и адаптироваться к запросу веб-браузера.

Пример

Следующая программа Perl показывает все переданные переменные среды веб-сервером:

#! / usr / bin / env perl = head1 ОПИСАНИЕ printenv - программа CGI, которая просто печатает свое окружение = cut print "Content-Type: text / plain \ n \ n"; для моего $ var (ключи сортировки% ENV) {printf "% s = \"% s \ "\ n", $ var, $ ENV {$ var}; }

Если веб-браузер выдает запрос переменных среды по адресу http://example.com/cgi-bin/printenv.pl/foo/bar?var1=value1var2=with%20percent%20encoding, 64-битный веб-сервер Windows 7 под управлением cygwin возвращает следующую информацию:

COMSPEC = "C: \ Windows \ system32 \ cmd.exe" DOCUMENT_ROOT = "C: / Program Files (x86) / Apache Software Foundation / Apache2.4 / htdocs" GATEWAY_INTERFACE = "CGI / 1.1" HOME = "/ home / SYSTEM" HTTP_ACCEPT = "text / html, application / xhtml + xml, application /xml;q=0.9,*/*;q=0.8 "HTTP_ACCEPT_CHARSET =" ISO-8859-1, utf-8; q = 0.7, *; q = 0.7 "HTTP_ACCEPT_ENCODING =" gzip, deflate, br "HTTP_ACCEPT_LANGUAGE =" en-us, en; q = 0.5 "HTTP_CONNECTION =" keep-alive "HTTP_HOST =" example.com "HTTP_USER_AGENT =" Mozilla / 5.0 (Windows NT 6.1; WOW64; rv: 67.0) Gecko / 20100101 Firefox / 67.0 "ПУТЬ = "/ главная / СИСТЕМА / bin: / bin: / cygdrive / c / program ~ 2 / php: / cygdrive / c / windows / system32:..." PATHEXT = ". COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC "PATH_INFO =" / foo / bar "PATH_TRANSLATED =" C: \ Prog RAM-файлы (x86) \ Apache Software Foundation \ Apache2.4 \ htdocs \ foo \ bar "QUERY_STRING =" var1 = value1 var2 = с% 20percent% 20encoding "REMOTE_ADDR =" 127.0.0.1 "REMOTE_PORT =" 63555 "REQUEST_METHOD =" GET " REQUEST_URI = "/ cgi-bin / printenv.pl / foo / bar? Var1 = value1 var2 = with% 20percent% 20encoding" SCRIPT_FILENAME = "C: / Program Files (x86) / Apache Software Foundation / Apache2.4 / cgi-bin / printenv.pl "SCRIPT_NAME =" / cgi-bin / printenv.pl "SERVER_ADDR =" 127.0.0.1 "SERVER_ADMIN =" (адрес электронной почты администратора сервера) "SERVER_NAME =" 127.0.0.1 "SERVER_PORT =" 80 "SERVER_PROTOCOL =" HTTP / 1.1 "SERVER_SIGNATURE =" "SERVER_SOFTWARE =" Apache / 2.4.39 (Win32) PHP / 7.3.7 "SYSTEMROOT =" C: \ Windows "TERM =" cygwin "WINDIR =" C: \ Windows "

Некоторые, но не все, из этих переменных определены стандартом CGI. Некоторые, такие как PATH_INFO, QUERY_STRINGи те, которые начинаются с HTTP_, передают информацию из HTTP-запроса.

Из среды видно, что веб-браузер - это Firefox, работающий на ПК с Windows 7, веб-сервер - это Apache работает в системе, которая эмулирует Unix, а сценарий CGI называется cgi-bin / printenv.pl.

Затем программа может генерировать любой контент, записывать его в стандартный вывод, и веб-сервер передаст его браузеру.

Ниже перечислены переменные среды, передаваемые в программы CGI:

  • Переменные, специфичные для сервера:
  • Переменные запроса:
    • SERVER_PROTOCOL: HTTP / версия.
    • SERVER_PORT: TCP-порт (десятичный).
    • REQUEST_METHOD: имя метода HTTP (см. Выше).
    • PATH_INFO: суффикс пути, если добавлен к URL-адресу после имени программы и косой черты.
    • PATH_TRANSLATED: соответствующий полный путь , как предполагается сервером, если присутствует PATH_INFO.
    • SCRIPT_NAME: относительный путь к программе, например /cgi-bin/script.cgi.
    • QUERY_STRING: часть URL-адреса после символа ?. Строка запроса может состоять из пар * имя= значение, разделенных амперсандами (например, var1= val1var2= val2...) при использовании для отправки form данных, переданных с помощью метода GET, как определено в HTML application / x- www-form-urlencoded.
    • REMOTE_HOST: имя хоста клиента, не заданное, если сервер не выполнял такой поиск.
    • REMOTE_ADDR: IP-адрес клиента (точка- десятичный).
    • AUTH_TYPE: тип идентификации, если применимо.
    • REMOTE_USERиспользуется для определенного AUTH_TYPEs.
    • REMOTE_IDENT: см. identity, только если сервер выполнил такой поиск.
    • CONTENT_TYPE: Тип Интернет-носителя входных данных, если используется метод PUT или POST, как указано в заголовке HTTP.
    • CONTENT_LENGTH: аналогично, размер входных данных (десятичных, в октетах ), если они предоставлены через заголовок HTTP.
    • Переменные, передаваемые пользовательским агентом (HTTP_ACCEPT, HTTP_ACCEPT_LANGUAGE, HTTP_USE R_AGENT, HTTP_COOKIEи, возможно, другие) содержат значения соответствующих заголовков HTTP и, следовательно, имеют тот же смысл.

Программа возвращает результат веб-серверу в виде стандартного вывода, начиная с заголовка и пустой строки.

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

Вот простая программа CGI, написанная на Python 3 вместе с HTML, которая решает простую задачу сложения.

add.html:

Введите два числа, чтобы сложить

add.cgi:

#! / Usr / bin / env python3 import cgi, cgitb cgitb.enable () input_data = cgi.FieldStorage () print ('Content-Type : text / html ') # HTML следует за print (' ') # Оставьте пустую строку print (' 

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

') попробуйте: num1 = int (input_data ["num1"]. value) num2 = int (input_data ["num2"]. value) except: print ('К сожалению, скрипт не может преобразовать ваши входные данные в числа (целые числа).') raise SystemExit (1) print ('{ 0} + {1} = {2}'.format (num1, num2, num1 + num2))

Эта программа Python 3 CGI получает входные данные из HTML и складывает два числа вместе.

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

Веб-сервер, поддерживающий CGI, можно настроить для интерпретации URL, который он служит ссылкой на сценарий CGI. Распространенное соглашение - иметь каталог cgi-bin/ в основе дерева каталогов и обрабатывать все исполняемые файлы в этом каталоге (и никакие другие для безопасности) как сценарии CGI.. Другое популярное соглашение - использовать расширения имени файла ; например, если сценариям CGI последовательно присваивается расширение .cgi, веб-сервер можно настроить для интерпретации всех таких файлов как сценариев CGI. Хотя он удобен и необходим для многих заранее подготовленных сценариев, он открывает сервер для атаки, если удаленный пользователь может загрузить исполняемый код с надлежащим расширением.

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

Использует

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

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

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

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

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

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

Вызов команды обычно означает вызов вновь созданного процесс на сервере. Запуск процесса может занять гораздо больше времени и памяти, чем фактическая работа по генерации вывода, особенно когда программу все еще необходимо интерпретировать или скомпилировать. Если команда вызывается часто, результирующая рабочая нагрузка может быстро перегрузить сервер.

накладные расходы, связанные с созданием процесса, могут быть уменьшены с помощью таких методов, как FastCGI, которые обрабатывают интерпретатор "prefork", или путем выполнения кода приложения полностью на веб-сервере., используя модули расширения, такие как mod_perl или mod_php. Другой способ уменьшить накладные расходы - использовать предварительно скомпилированные программы CGI, например записывая их на таких языках, как C или C ++, а не на интерпретируемых или компилируемых на лету языках, таких как Perl или PHP, или путем реализации программного обеспечения для создания страниц в виде настраиваемого модуля веб-сервера.

Альтернативные подходы включают:

  • Расширения, такие как модули Apache, плагины NSAPI и плагины ISAPI, позволяют запускать стороннее программное обеспечение на веб-сервере. Web 2.0 позволяет передавать данные от клиента к серверу без использования HTML-форм и незаметно для пользователя.
  • FastCGI снижает накладные расходы, позволяя одному длительно выполняющемуся процессу обрабатывать более один запрос пользователя. В отличие от преобразования приложения в подключаемый модуль веб-сервера, приложения FastCGI остаются независимыми от веб-сервера.
  • Простой общий интерфейс шлюза или SCGI разработан таким образом, чтобы его было легче реализовать, но при этом сокращается задержка в некоторых операциях по сравнению с CGI.
  • Также можно использовать замену архитектуры для динамических сайтов. Это подход, принятый в Java EE, который запускает код Java в контейнере сервлетов Java для обслуживания динамического контента и, возможно, статического контента. Этот подход заменяет накладные расходы на создание и уничтожение процессов гораздо более низкими накладными расходами на создание и уничтожение потоков, а также предоставляет программисту доступ к библиотеке, которая поставляется с Java Platform, Standard Edition на на которой основана используемая версия Java EE.

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

См. Также

Ссылки

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

Последняя правка сделана 2021-05-15 07:09:15
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте