Как работают сценарии CGI

Carding 4 Carders

Professional
Messages
2,729
Reaction score
1,521
Points
113
cgi-intro.jpg

В статье «Как работают веб-страницы» обсуждаются основные функции HTML и показано, как создавать веб-страницы, содержащие текст и графику. Он также показывает вам, как разместить вашу страницу «в эфире» с помощью хостинга. Один из вопросов, который часто задают новые дизайнеры веб-сайтов после создания своего сайта: «Что такое CGI Scripting и как я могу использовать его на своем сайте?» или "Как мне создать интерактивные формы на моем сайте?"

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

Веб-серверы​

cgi-directory-a.gif

Как описано в статье Как работают веб-серверы, веб-серверы могут быть довольно простыми. По сути, веб-серверы просто извлекают файл с диска и отправляют его по сети запрашивающему браузеру. Допустим, вы вводите URL-адрес bygpub.com/books/tg2rw/author.htm. Сервер получает запрос на файл /books/tg2rw/author.htm. Если вы посмотрите на следующий рисунок, вы увидите, как сервер разрешает этот запрос:
Во время установки веб-серверу было дано указание понять, что c: \ My Documents \ www является корневым каталогом сервера. Затем он ищет /books/tg2rw/author.htm в этом корне. Когда вы запрашиваете URL-адрес bygpub.com/books/tg2rw/, сервер понимает, что вы ищете файл по умолчанию для этого каталога. Он ищет несколько разных имен файлов, чтобы попытаться найти файл по умолчанию: index.html, index.htm, default.html, default.htm. В зависимости от сервера он может искать и другие. Таким образом, сервер превращает [URL bygpub.com/books/tg2rw/ в bygpub.com/books/tg2rw/index.htm и доставляет этот файл. Все остальные файлы должны быть указаны путем явного именования файлов.
Так все веб-серверы обрабатывают статические файлы. Большинство веб-серверов также обрабатывают динамические файлы - через механизм, называемый Common Gateway Interface, или CGI. Вы видели CGI в самых разных местах сети, хотя, возможно, не знали об этом в то время. Например:
  • Любая гостевая книга позволяет вам ввести сообщение в форме HTML, а затем, при следующем просмотре гостевой книги, страница будет содержать вашу новую запись.
  • Форма WHOIS в Network Solutions позволяет вам ввести доменное имя в форму, и возвращаемая страница будет отличаться в зависимости от введенного имени домена.
  • Любая поисковая система позволяет вам вводить ключевые слова в HTML-форму, а затем динамически создает страницу на основе введенных вами ключевых слов.
Все эти динамические страницы используют CGI.

Механизм CGI​

На большинстве веб-серверов механизм CGI стандартизирован следующим образом. В обычном дереве каталогов, которое сервер считает корневым, вы создаете подкаталог с именем cgi-bin. (Вы можете увидеть этот каталог на рисунке на предыдущей странице.) Затем сервер понимает, что любой файл, запрашиваемый из специального каталога cgi-bin, не должен просто считываться и отправляться, а должен выполняться. Результат выполненной программы - это то, что она фактически отправила браузеру, запросившему страницу. Исполняемый файл обычно представляет собой либо чистый исполняемый файл, например, вывод компилятора C, либо сценарий PERL. PERL - чрезвычайно популярный язык для написания сценариев CGI.
Представьте, что вы вводите следующий URL-адрес в свой браузер: carder.market/search/. Сервер распознал, что /search/ находится в каталоге cgi-bin, поэтому он выполняет search (который является сценарием PERL) и отправляет результат выполнения в ваш браузер.

Вы можете написать свои собственные сценарии и попробовать CGI самостоятельно при условии, что:
  • Вы знаете такой язык программирования, как C или PERL.
  • У вас есть доступ к веб-серверу, который обрабатывает сценарии CGI. Если вы заплатили службе веб-хостинга за размещение своего веб-сайта, то, скорее всего, у вас есть доступ к сценариям CGI через ваш хост. За подробностями обращайтесь к службе хостинга. Если нет, то вы можете поэкспериментировать, установив веб-сервер на домашнем компьютере и научившись его использовать. Второй вариант немного сложнее, но вы гарантированно многому научитесь в процессе!

Простые сценарии CGI​

Предполагая, что у вас есть доступ к каталогу cgi-bin (см. Предыдущий раздел), и предполагая, что вы знаете либо язык программирования C, либо PERL, вы можете провести целый ряд интересных экспериментов с CGI, чтобы получить удовольствие. Начнем с создания простейшего сценария CGI.
В статье «Как работают веб-страницы» мы рассмотрели простейшую веб-страницу в формате HTML. Выглядело это примерно так:
Code:
<html>
<body>
<h1> Здравствуйте!</h1>
</body>
</html>

Простейший возможный сценарий CGI после выполнения создавал бы эту простую статическую страницу в качестве своего вывода. Вот как выглядела бы эта CGI-программа, если бы вы написали ее на C:
Code:
#include <stdio.h>

int main()
{
  printf("Content-type: text/html\n\n");
  printf("<html>\n");
  printf("<body>\n");
  printf("<h1>Hello there!</h1>\n");
  printf("</body>\n");
  printf("</html>\n");
  return 0;
}

На своем веб-сервере я ввел эту программу в файл simplest.c, а затем скомпилировал ее, сказав:
Code:
gcc simplest.c -o simplest.cgi
(Подробнее о компиляции программ на языке C см. В разделе «Как работает программирование на C».)

Поместив simplest.cgi в каталог cgi-bin, его можно запустить. Как видите, все, что делает скрипт, - это генерирует страницу с надписью «Привет!» Единственная неожиданная часть - это строка, в которой говорится:
Code:
printf("Content-type: text/html\n\n");
Строка "Content-type: text/html\n\n"- это особый фрагмент текста, который должен быть первым, что отправляется браузеру любым сценарием CGI. Пока вы не забываете это делать, все будет хорошо. Если вы забудете, браузер отклонит вывод скрипта.

Вы можете сделать то же самое в PERL. Введите этот код PERL в файл с именем simplest.pl:
Code:
#! /usr/bin/perl
print "Content-type: text/html\n\n";
print "<html><body><h1>Hello World!";
print "</h1></body></html>\n";

Поместите файл в каталог cgi-bin. На машине UNIX может также помочь набрать:
Code:
chmod 755 simplest.pl
Это сообщает UNIX, что сценарий исполняемый.
Вы только что ознакомились с основной идеей создания сценариев CGI. Это действительно так просто! Программа запускается, и ее выходные данные отправляются в браузер, который вызвал сценарий. Нормальный вывод, отправляемый на стандартный вывод, - это то, что отправляется в браузер.
Однако весь смысл сценариев CGI заключается в создании динамического контента - каждый раз, когда сценарий выполняется, результат должен быть другим. В конце концов, если результат каждый раз при запуске сценария один и тот же, то с таким же успехом можно использовать статическую страницу. Следующая программа на C демонстрирует очень простой динамический контент:
Code:
#include <stdio.h>

int incrementcount()
{
  FILE *f;
  int i;

  f=fopen("count.txt", "r+");
  if (!f)
  {
     sleep(1);
     f=fopen("count.txt", "r+");
     if (!f)
       return -1;
  }

  fscanf(f, "%d", &i);
  i++;
  fseek(f,0,SEEK_SET);
  fprintf(f, "%d", i);
  fclose(f);
  return i;
}

int main()
{
  printf("Content-type: text/html\n\n");
  printf("<html>\n");
  printf("<body>\n");
  printf("<h1>The current count is: ")
  printf("%d</h1>\n", incrementcount());
  printf("</body>\n");
  printf("</html>\n");
  return 0;
}

В текстовом редакторе введите эту программу в файл с именем count.c. Скомпилируйте его, набрав:
Code:
gcc count.c -o count.cgi
Создайте еще один текстовый файл с именем count.txt и поместите в него один ноль. Поместив counter.cgi и count.txt в каталог cgi-bin , вы можете запустить сценарий. Все, что делает сценарий, - это генерирует страницу, на которой написано: «Текущий счетчик: X», где X увеличивается один раз при каждом запуске сценария. Попробуйте запустить его несколько раз и посмотрите, как меняется содержимое страницы!
Count.txt файл содержит текущее значение счетчика, и немного incrementcount () функция является функцией , которая увеличивает счетчик в count.txt файле. Эта функция открывает файл count.txt, считывает из него число, увеличивает число и записывает его обратно в файл. Функция фактически пытается открыть файл дважды. Это происходит на тот случай, если два человека попытаются получить доступ к файлу одновременно. Это, конечно, не надежный метод, но для чего-то настолько простого он работает. Если файл не может быть открыт со второй попытки, вызывающей стороне возвращается значение ошибки -1. Более сложная программа распознала бы возвращаемое значение -1 и сгенерировала бы соответствующее сообщение об ошибке.

Формы: отправка ввода​

Мы увидели, что создавать сценарии CGI довольно просто. Веб-сервер выполняет любой исполняемый файл, помещенный в каталог cgi-bin, и любой вывод, который исполняемый файл отправляет на stdout, появляется в браузере, который вызвал сценарий. Теперь нам нужен способ отправки ввода в сценарий. Обычный способ отправки ввода - использовать HTML- форму.

Вы видите формы по всему Интернету. Любая страница, на которой вы могли что-то ввести, является формой. Вы видите их в поисковых системах, гостевых книгах, анкетах и т.д. Домашняя страница HowStuffWorks.com содержит как минимум две мини-формы, одну для "Как вы сюда попали?" боковая панель и одна для боковой панели предложений (да, одна страница HTML может содержать несколько форм). Вы создаете форму на своей HTML-странице, и в HTML-тегах для формы вы указываете имя CGI-сценария, который будет вызываться, когда пользователь нажимает кнопку «Отправить» в форме. Значения, которые пользователь вводит в форму, упаковываются и отправляются в сценарий, который затем может использовать их любым способом.

На самом деле вы постоянно видели подобные вещи и, возможно, не знали, что это происходит. Например, перейдите на http://www.lycos.com, введите слово «test» в поле «Search for:» и нажмите «Go Get It!». кнопка. URL-адрес страницы результатов будет выглядеть так:
Code:
http://www.lycos.com/cgi-bin/pursuit?matchmode=and&cat=lycos&query=test&x=10&y=9

Вы можете видеть, что домашняя страница Lycos - это форма. У Lycos есть сценарий в каталоге cgi-bin под названием преследование. Форма отправляет скрипту пять параметров:
  1. matchmode=and
  2. cat=lycos
  3. query=test
  4. x=10
  5. y=9
Третий - это введенная нами строка поиска. Остальные четыре тоже что-то значат для сценария. Сценарий CGI запрашивает в базе данных Lycos слово «тест», а затем возвращает результаты. Это сердце любой поисковой системы!

Давайте создадим простую форму, чтобы попробовать это. Создайте файл с именем simpleform.htm и введите в него следующий HTML- код:
Code:
<html>
<body>
  <h1>A super-simple form<h1>
  <FORM METHOD=GET ACTION="https://www.carder.market/
cgi-bin/simpleform.cgi">
  Enter Your Name:
  <input name="Name" size=20 maxlength=50>
  <P>
  <INPUT TYPE=submit value="Submit">
  <INPUT TYPE=reset value="Reset">
  </FORM>
</body>
</html>

Код HTML определяет создание формы, которая использует метод GET, отправленный в сценарий CGI по адресу carder.market/cgi-bin/simpleform.cgi. Внутри формы находится область ввода текста плюс стандартные кнопки «Отправить» и «Сброс».
Файл arder.uk/cgi-bin/simpleform.cgi, на который ссылается форма, является программой на языке C. Он начал свою жизнь, когда этот фрагмент кода C был помещен в файл с именем simpleform.c:
Code:
#include <stdio.h>
#include <stdlib.h>

int main()
{
  printf("Content-type: text/html\n\n");
  printf("<html>\n");
  printf("<body>\n");
  printf("<h1>The value entered was: ")
  printf("%s</h1>\n", getenv("QUERY_STRING"));
  printf("</body>\n");
  printf("</html>\n");
  return 0;
}

Он был скомпилирован с помощью следующей команды:
Code:
gcc simpleform.c -o simpleform.cgi
И он был помещен в каталог cgi-bin. Эта программа просто принимает значение, отправленное формой, и отображает его. Например, вы можете увидеть следующее:
Code:
The value entered was: Name=John+Smith
Name - это идентификатор поля ввода текста в форме (каждое поле ввода в форме должно иметь уникальный идентификатор), а John+Smith - это типичное имя, которое может быть введено в форму. Обратите внимание, что «+» заменяет пробел.

Из этого примера вы можете видеть, что основной процесс настройки формы и получения данных из формы в сценарий CGI довольно прост. Вот пара деталей, о которых следует помнить:
  • Каждое поле ввода в форме должно иметь уникальный идентификатор.
  • Форма должна использовать метод GET или POST. Преимущество метода GET заключается в том, что вы можете видеть значения формы в URL-адресе, отправленном скрипту, что упрощает отладку.
  • Существуют определенные ограничения на количество символов, которые могут быть отправлены с помощью метода GET, поэтому POST предпочтительнее для больших форм.
  • Данные, поступающие с помощью метода GET, принимаются путем просмотра переменной среды QUERY_STRING (обычно считываемой с помощью функции getenv в C или средства $ ENV в PERL). Данные , которые приходят в с помощью метода POST доступен через STDIN с помощью получает в C или прочитать в PERL.
  • Все поля поступающих данных будут объединены в одну строку, и многие символы будут заменены и, следовательно, потребуют перевода. Например, все пробелы будут заменены на плюсы.

Переменная среды QUERY_STRING поднимает тему переменных среды в целом. Есть ряд переменных среды, которые вы можете исследовать в своих сценариях CGI, в том числе:
  • AUTH_TYPE
  • CONTENT_LENGTH
  • CONTENT_TYPE
  • GATEWAY_INTERFACE
  • HTTP_ACCEPT
  • HTTP_USER_AGENT
  • PATH_INFO
  • PATH_TRANSLATED
  • QUERY_STRING
  • REMOTE_ADDR
  • REMOTE_HOST
  • REMOTE_IDENT
  • REMOTE_USER
  • REQUEST_METHOD
  • SCRIPT_NAME
  • SERVER_NAME
  • SERVER_PORT
  • SERVER_PROTOCOL
  • SERVER_SOFTWARE
В этих переменных окружения скрыта всевозможная интересная информация, в том числе длина входной строки (CONTENT_LENGTH), используемый МЕТОД (GET или POST - REQUEST_METHOD позволяет выяснить, искать ли входные данные в STDIN или QUERY_STRING). ), IP-адрес компьютера пользователя (REMOTE_ADDR) и так далее. Полное описание этих переменных см. В теме «Переменные среды CGI».

Создание реальной формы​

Настоящая форма будет состоять из множества областей ввода, и потребуется некоторый объем кода в сценарии, чтобы отменить сопоставления символов и проанализировать отдельные строки. Начнем с рассмотрения стандартных элементов управления вводом в форме. Они включают:
  • Однострочный ввод текста
  • Многострочный ввод текста
  • Списки выбора
  • Флажки
  • Радио-кнопки
  • Специализированные кнопки для отправки или очистки формы
Вы можете комбинировать эти элементы управления с другим статическим текстом и графикой, как на любой другой странице.
Вот несколько примеров, демонстрирующих использование различных тегов управления:

Однострочное редактирование
Слово «ввод» обозначает область редактирования одной строки. Поле «имя» предоставляет идентификатор элемента управления сценарию CGI и должно быть уникальным для каждого элемента управления в форме. Поле «размер» указывает ширину в символах области ввода формы. «Maxlength» ограничивает максимальное количество символов в области ввода. «Значение» устанавливает начальное значение.
Code:
Enter Name: <input name="Name" size=30 maxlength=50
value="Sample">

Обычно области ввода предшествует фрагмент статического текста, определяющий назначение поля ввода. Здесь показан статический текст «Введите имя:».
Вы можете добавить значение «type = int», чтобы ограничить ввод целочисленными значениями. По умолчанию тип - «текст», и он принимает любые символы.

Многострочное редактирование
Многострочная область редактирования аналогична области ввода. Вы определяете имя для элемента управления и определяете его размер в форме в строках и столбцах. Все, что вы помещаете перед тегом </textarea>, будет отображаться в элементе управления как значение по умолчанию.
Code:
<textarea name="Company Address" cols=30
rows=4></textarea>

Флажки
Флажок - это специализированная форма области ввода с типом «флажок».
Code:
<input type=checkbox name="Include" value=1>
Значение будет возвращено, если флажок установлен.

Радио-кнопки
Радиокнопки похожи на флажки, но визуально сгруппированы вместе:
Code:
Choose the search area:<br>
<input type=radio CHECKED name=universe value=US-STOCK>
Stocks
<input type=radio name=universe value=CA-STOCK>
Canadian Stocks
<input type=radio name=universe value=MMF>
Money Markets
<input type=radio name=universe value=MUTUAL>
Mutual Funds
Обратите внимание, что радиокнопка по умолчанию может быть помечена словом CHECKED. Также обратите внимание, что все переключатели в одной группе имеют одинаковое имя.

Списки выбора
Список выбора предлагает пользователю выбор из ряда вариантов. Тег для списка выбора позволяет указать количество видимых строк в поле «размер», а также значения для всех параметров.
Code:
Select an Option<br>
<SELECT size=2 NAME="Option">
    <OPTION> Option 1
    <OPTION> Option 2
    <OPTION> Option 3
    <OPTION> Option 4
</SELECT>
Слово MULTIPLE создает возможность множественного выбора.

Специализированные кнопки
Следующие теги создают две специальные кнопки: одна для отправки формы на сервер, а вторая для сброса формы:
Code:
<INPUT TYPE=submit value="Submit">
<INPUT TYPE=reset value="Reset">

Собираем все вместе​

Допустим, вы хотите создать простую анкету для одной из своих веб-страниц. Например, вы хотите запросить имя, пол, возраст и комментарий читателя, а затем обработать его в сценарии CGI. HTML-форма может находиться в файле с именем carder.market/survey.htm и выглядеть так:
Code:
<html>
  <body>
    <h1>Carder.uk Survey Form<h1>
    <FORM METHOD=POST ACTION="http:
//www.carder.market/cgi-bin/survey.cgi">
    Enter Your Name:
    <input name="Name" size=20 maxlength=50>
    <P>Enter your sex:
    <input type=radio CHECKED name=sex value=MALE>Male
    <input type=radio name=sex value=FEMALE>Female
    <P>Select your age<br>
    <SELECT size=2 NAME=age>
      <OPTION> 1-10
      <OPTION> 11-20
      <OPTION> 21-30
      <OPTION> 31-40
      <OPTION> 41-50
      <OPTION> 51-60
      <OPTION> 61 and up
    </SELECT>
    <P>Enter Your Comment:
    <input name="Name" size=40 maxlength=100>
    <P>
    <INPUT TYPE=submit value="Submit">
    <INPUT TYPE=reset value="Reset">
    </FORM>
  </body>
</html>
Сценарий CGI, на который ссылается эта форма, получит четыре разных элемента данных: имя, возраст, пол и комментарий читателя, отправившего форму. Сценарий должен будет проанализировать четыре значения и обработать все преобразования символов. Отдельный файл с именем https://www.carder.market/survey.c был использован для создания скрипта survey.cgi и имеет длину около 100 строк.

Резюме​

В этом кратком обзоре сценариев CGI мы увидели, что:
  • Сценарий CGI - это программа, обычно это программа на языке C или сценарий PERL.
  • На большинстве серверов сценарии CGI находятся в каталоге cgi-bin. Сценарий выполняется, когда URL-адрес сценария запрашивается браузером.
  • Все, что сценарий отправляет в STDOUT, будет отправлено в браузер. Строка "Content-type: text/html\n\n" должна быть отправлена в первую очередь. После этого все идет; но обычно отправляются действительные теги HTML для действительного документа HTML.
  • Входные данные отправляются в сценарий путем создания HTML-формы, действие которой указывает URL-адрес сценария.
  • Когда сценарий получает данные из формы, он должен проанализировать различные строки и преобразовать все измененные символы. Мы видели простую программу на C, которая может выполнять эти задачи. Библиотека CGI для PERL упрощает преобразование сценариев PERL.
Если бы вы делали это на реальном веб-сайте, вы обычно сохраняли бы результаты каждого опроса в текстовом файле или базе данных, чтобы вы могли просмотреть результаты позже. Это легко сделать с помощью программы на языке C или сценария PERL.
 
Top