Что такое формат файла CGI?
Расширение .cgi означает Common Gateway Interface - стандартный подход к генерации веб-приложений и динамического контента на веб-страницах. Расширение .cgi на веб-сервере обеспечивает интерфейс между исполняемыми программами и веб-сервером, который генерирует содержимое сайта. Все такие программы называются CGI или CGI-скриптами.
Эти файлы обычно пишутся с использованием скриптового языка, такого как Perl, Python или shell-скрипт, хотя файл .cgi может быть и скомпилированным двоичным файлом (например, программа на C). Расширение само по себе ничего не говорит о языке внутри - строка shebang в самом верху скрипта, например #!/usr/bin/perl или #!/usr/bin/python3, сообщает веб-серверу, какой интерпретатор вызвать.
Скрипт CGI выполняется на сервере один раз на каждый входящий HTTP-запрос. Он считывает данные запроса из переменных окружения (QUERY_STRING, REQUEST_METHOD, CONTENT_TYPE) и принимает данные тела POST через stdin, а затем записывает HTTP-ответ - заголовки, за которыми следует тело ответа - непосредственно в stdout. Чтобы работать, файл должен находиться в каталоге, поддерживающем CGI (традиционно /cgi-bin/), и иметь установленное разрешение на выполнение.
.cgi - это стандарт интерфейса, а не язык программирования. Несколько других форматов файлов используют расширение .cgi: .pl, .py или .sh-скрипты часто переименовываются в .cgi, чтобы веб-сервер перенаправлял их через механизм CGI. Поскольку CGI создает новый процесс для каждого запроса, он медленный на масштабах, и в основном был вытеснен FastCGI, mod_php, WSGI и современными серверами приложений - хотя он по-прежнему поддерживается на большинстве веб-серверов сегодня.
Безопасность и защита
РИСК: MEDIUMЧтение .cgi в текстовом редакторе безопасно - он не запустится от простого открытия. Риск заключается в ВЫПОЛНЕНИИ на сервере: скрипты CGI выполняются с привилегиями сервера и исторически являются большой поверхностью веб-уязвимостей (уязвимость Shellshock 2014 года эксплуатировалась в основном через CGI-скрипты оболочки; плохо написанные CGIs позволяют внедрение команд, обход путей и произвольное выполнение кода). Никогда не развертывайте скачанный .cgi, который вы не понимаете, держите интерпретаторы и сервер в актуальном состоянии, ограничивайте разрешения /cgi-bin/ и для новых работ предпочитайте альтернативы FastCGI/серверов приложений. Относитесь к неизвестному исходному коду CGI как к ненадёжному коду, который нужно проверить перед запуском.
Детали формата
в двух словах- EToys / нишевые данные приложений с использованием .cgi - Несколько не связанных приложений переиспользовали .cgi для своих файлов данных; на веб-сервере .cgi почти всегда является скриптом-шлюзом.
Программы, открывающие файлы CGI
Технические подробности
глубокая спецификация| MIME-тип | application/x-httpd-cgi |
| Альтернативные MIME-типы | text/plain, application/octet-stream |
| Кодировка файла | Простой текст (ASCII/UTF-8) для скриптов; собственный двоичный формат для скомпилированных исполняемых файлов |
| Сигнатура файла | Нет фиксированных magic bytes - текстовые скрипты открываются со строкой shebang (#!/usr/bin/perl, #!/usr/bin/python3, #!/bin/sh и т.д.); скомпилированные двоичные файлы CGI содержат заголовок исполняемого файла платформы (ELF в Linux, MZ в Windows) |
| Модель выполнения | Веб-сервер создаёт новый процесс ОС на каждый HTTP-запрос для запуска скрипта или двоичного файла; процесс завершается после отправки ответа |
| Механизм ввода | Данные запроса передаются через переменные окружения (QUERY_STRING, REQUEST_METHOD, CONTENT_TYPE, заголовки HTTP_*); тело POST передаётся через stdin |
| Механизм вывода | Скрипт записывает заголовки HTTP-ответа (строки Имя: значение), за которыми следует пустая строка и тело ответа непосредственно в stdout |
| Необходимые условия развертывания | Файл должен находиться в каталоге, поддерживающем CGI (по соглашению /cgi-bin/), с установленным битом выполнения; пользователю веб-сервера нужны права на чтение и выполнение |
| Типичные скриптовые языки | Perl, Python, Bash/shell, Ruby, C (скомпилированный в собственный двоичный файл) |
| Типичный размер файла | 1 КБ - 100 КБ для текстовых скриптов; больше для скомпилированных двоичных файлов |
| Сжатие | Отсутствует внутри самого файла; тело HTTP-ответа может быть отдельно сжато gzip скриптом или сервером |
| Поддержка платформы | Linux, Unix, macOS, Windows - любая ОС, запускающая веб-сервер, поддерживающий CGI |
| Популярные веб-серверы | Apache HTTP Server, Nginx (через обёртку FastCGI), lighttpd, Microsoft IIS |
| Характеристика производительности | Медленный на масштабах - каждый запрос создаёт и уничтожает новый процесс; вытеснен FastCGI, WSGI и ASGI для высоконагруженных развертываний |
| Вопросы безопасности | Исходный код скрипта читаем на диске; защищайте строгими правами доступа к файлам и не exposing каталог CGI через прямой URL вне указанного пути /cgi-bin/ |
| Выпущен | 1993 (NCSA HTTPd); formalized as CGI/1.1 in RFC 3875 (2004) |
| Последняя версия | CGI/1.1 (RFC 3875, October 2004) |
| Открыть стандартное | Да · без роялти |
| Спецификация | www.rfc-editor.org |
Конвертации CGI
Вопросы и ответы сообщества
спрошено пользователямиВопросов пока нет - станьте первым, кто спросит о файлах CGI.