Cgi программы что это такое

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

Теория CGI

CGI – (Common Gateway Interface) – Общий Шлюзовый Интерфейс. Как не трудно догадаться интерфейс этот служит шлюзом между сервером (здесь я подразумеваю программу — сервер) и какой-либо внешней программой написанной для ОС на которой этот самый сервер запущен. Таким образом CGI отвечает за то, каким именно образом данные будут переданы от программы-сервера к CGI-программе и обратно. Интерфейс не накладывает никаких ограничений на то, на чем должна быть написана CGI-программа, это может быть как обычный исполнимый файл, так и любой другой файл – главное, чтобы сервер смог его запустить (в среде windows это например может быть файл с расширением, привязанным к какой-либо программе).
С момента когда Вы вызвали (например нажали кнопку формы, к которой привязан вызов CGI-программы) CGI-программу до получения вами результата в окно браузера происходит следующее:
— Вэб-клиент (например браузер) создает подключение к серверу, указанному в URL;
— Вэб-клиент посылает запрос серверу, запрос этот обычно делается с помощью двух методов GET или POST;
— Данные из запроса клиента (например значения полей формы) передаются сервером, используя CGI-интерфейс, CGI-программе, указанной в URL;
— CGI-программа обрабатывает данные клиента, полученные от сервера и генерирует на основе этой обработки ответ клиенту, который она передает по все тому же CGI-интерфейсу серверу, а он в свою очередь передает его уже непосредственно клиенту;
— Сервер разрывает соединение с клиентом.
В стандартной спецификации CGI принято, что сервер может обмениваться с программой следующими способами:
— Переменные окружения – они могут быть установлены сервером при запуске программы;
— Стандартный поток ввода (STDIN) – с его помощью сервер может передать данные программе;
— Стандартный поток вывода (STDOUT) – программа может писать в него свой вывод, передающийся серверу;
— Командная строка – в ней сервер может передать некоторые параметры программе.
Стандартные потоки ввода/вывода весьма удобны и широко используются на UNIX-системах, чего не скажешь о windows, поэтому существует спецификация CGI, разработанная специально для windows-систем так и называемая «Windows CGI». Но, естественно, и стандартные потоки ввода/вывода так же можно использовать в windows CGI программировании.

Здесь я не буду затрагивать стандарт «Windows CGI», и на это существует по крайней мере две причины – первая, и самая главная – на данный момент не все http-сервера под windows поддерживают эту спецификацию (в частности мой любимый Apache 1.3.19). Вторую причину вы можете наблюдать набрав в любой поисковой системе строчку «Windows CGI». Отмечу относительно этого интерфейса лишь общие детали – все данные от сервера к клиенту передаются посредством обычного для windows *.ini файла, имя которого передается программе в командной строке. При этом все данные в файле уже заботливо разбиты по секциям сервером и вам лишь остается используя функции «GetPrivateProfile*» извлечь их оттуда. Ответ серверу передается опять же посредством файла, имя которого указано в соответствующей записи ini-файла.
Какие же данные могут быть переданы клиентом CGI-программе? – практически любые. В общем случае программе передаются значения полей формы, которые заполняет клиент, но это также могут быть и какие-либо двоичные данные, например файл с картинкой или музыкой. Данные могут быть переданы на сервер двумя различными методами – это метод GET и метод POST. Когда мы создаем форму для заполнения на нашей страничке мы явно указываем каким из приведенных методов мы хотим отправить введенные пользователем данные, делается это в основном тэге формы примерно так:
При отправке данных методом GET, данные браузером считываются из формы и помещаются следом за URL скрипта, за знаком вопроса, если значимых полей в форме несколько, то они передаются все через значёк «your_age=90 HTTP/1.0
Использование метода GET имеет сразу несколько слабых сторон – первое и самое главное – т.к. данные передаются в URL то он имеет ограничение на количество этих самых передаваемых данных. Вторая слабость опять же вытекает из URL – это конфиденциальность, при такой передаче данные остаются абсолютно открытыми. Итак, хорошо если у нас в форме 2-3 небольших поля… встает вопрос что же делать если данных больше? Ответ – использовать метод POST!
При использовании метода POST данные передаются серверу как блок данных, а не в URL, что несколько развязывает нам руки для увеличения объема передаваемой информации, для вышеприведенного примера формы POST блок, посылаемый серверу будет примерно такой:

Читайте также:
Unlocker ассистент что за программа

POST /cgi-bin/test.exe HTTP/1.0
Accept: text/plain
Accept: text/html
Accept: */*
Content-type: application/x-www-form-urlencoded
Content-length: 36
your_name=Pupkinyour_age=90

  • Программа должна уметь писать в стандартный поток вывода (stdout), чтобы передать результат своей работы серверу;
  • Из первых двух пунктов следует, то, что для того, чтобы сервер мог передать нашей программе что-либо в stdin, а она могла ему что-либо ответить в stdout CGI-программа должна быть консольным приложением;
  • Наша программа должна уметь читать переменные своего окружения.
  • С ЧЕГО НАЧАТЬ ИЗУЧЕНИЕ 3D | CGI

    Что такое CGI?

    • STD_INPUT_HANDLE — для stdin (стандартный ввод);
    • STD_OUTPUT_HANDLE — для stdout (стандартный вывод);
    • STD_ERROR_HANDLE — для stderr.

    Функция возвратит необходимый нам для операций чтения/записи хэндл. Следующее что нам необходимо делать это писать/читать эти потоки. Делается это обычными операциями чтения/записи файлов, т.е. ReadFile и WriteFile. Тут есть одна тонкость, можно подумать, что для этих целей можно использовать WriteConsole/ReadConsole, да это действительно справедливо для консоли и будет прекрасно работать, результаты, так же как и с WriteFile будут выводиться на консоль, но продолжаться это будет пока мы не запустим нашу программу как скрипт на сервере. Происходит это потому что, когда нашу программу запускает сервер хндлы, возвращаемые функцией «GetStdHandle» уже не будут хндлами консоли как таковыми, они будут хэндлами pipe, что необходимо для связи двух приложений.
    Вот небольшой пример того, как должна выглядеть CGI-программа на ассемблере:

    .386
    .model flat,stdcall
    includelib import32.lib
    .const
    PAGE_READWRITE = 4h
    MEM_COMMIT = 1000h
    MEM_RESERVE = 2000h
    STD_INPUT_HANDLE = -10
    STD_OUTPUT_HANDLE = -11

    .data
    hStdout dd ?
    hStdin dd ?
    hMem dd ?
    header:
    db ‘Content-Type: text/html’,13,10,13,10,0
    start_html:
    db ‘Окружение CGI-программы выглядит так:
    ‘,13,10,0
    for_stdin:
    db ‘STDIN программы содержит:
    ‘,13,10,0
    end_html:

    db »,13,10,0
    nwritten dd ?
    toscr db 10 dup (32)
    db ‘ — Тип файла’,0
    .code
    _start:

    xor ebx,ebx
    call GetStdHandle,STD_OUTPUT_HANDLE
    mov hStdout,eax
    call GetStdHandle,STD_INPUT_HANDLE
    mov hStdin,eax

    call write_stdout, offset header
    call write_stdout, offset start_html

    call VirtualAlloc,ebx,1000,MEM_COMMIT+MEM_RESERVE,PAGE_READWRITE
    mov hMem,eax
    mov edi,eax
    call GetEnvironmentStringsA
    mov esi,eax
    next_symbol:
    mov al,[esi]
    or al,al
    jz end_string
    mov [edi],al
    next_string:
    cmpsb
    jmp short next_symbol
    end_string:
    mov [edi],’>rb add edi,3
    cmp byte ptr [esi+1],0
    jnz next_string
    inc edi
    stosb
    call write_stdout, hMem
    call write_stdout, offset for_stdin

    call GetFileSize,[hStdin],ebx
    mov edi,hMem
    call ReadFile,[hStdin],edi, eax,offset nwritten, ebx
    add edi,[nwritten]
    mov byte ptr [edi],0
    call write_stdout, hMem
    call write_stdout, offset end_html
    call VirtualFree,hMem
    call ExitProcess,-1

    write_stdout proc bufOffs:dword
    call lstrlen,bufOffs
    call WriteFile,[hStdout],bufOffs,eax,offset nwritten,0
    ret
    write_stdout endp
    extrn GetEnvironmentStringsA:near
    extrn GetStdHandle:near
    extrn ReadFile:near
    extrn WriteFile:near
    extrn GetFileSize:near
    extrn VirtualAlloc:near
    extrn VirtualFree:near
    extrn ExitProcess:near
    extrn lstrlen:near
    ends
    end _start

    Исполняемый файл строится командами:
    tasm32.exe /ml test.asm
    tlink32.exe /Tpe /ap /o test.obj
    Не забудьте, что программа должна быть консольной.
    Вызывать эту программу можно используя вышеописанную html-форму, нужно только поменять имя test.bat в форме на test.exe и скопировать его в /cgi-bin/ соответственно, при том можно выставить в методе запроса POST, программа его обрабатывает.
    Еще хочу отметить, что можно вызывать программу и по-другому, можно создать в каталоге cgi-bin файл например test.cgi с одной единственной строчкой «#!c:/_путь_/test.exe» и вызывать в запросах его, а сервер в свою очередь будет читать первую его строчку и запускать exe-файл, для этого необходимо, чтобы в настройках http-сервера было прописано расширение *.cgi как расширение для скриптов. При таком подходе сервер запустит нашу программу с командной строкой «test.exe путь_к_test.exe» это имеет несколько плюсов – первое, это то, что человек, запускающий наш скрипт не будет даже догадываться на чем скрипт написан, второе – так-как нам передается имя файла с нашей строчкой мы можем например дописать в этот файл какие-либо настройки для нашего скрипта, что упрощает отладку, кстати именно так работают все интерпретаторы – вы успели заметить, что во всех perl/php/итд программах, присутствует подобная строка – указывающая на сам командный интерпретатор. Так вот сервер при запуске cgi-программы, если расширение программы прописано у него как скрипт в настройках читает первую строку файла, и если она оказывается описанного выше формата, то запускает указанную в строчке программу с именем этого файла ч/з пробел, допустим что в строчке указан интерпретатор перла, он получив такой подарок начинает его выполнение, т.к. комментарий в перле это символ «#», то первую строчку он пропускает и идет дальнейшее выполнение скрипта, в общем штука удобная.

    Читайте также:
    Fastcopy что это за программа

    Источник: habr.com

    16.Классическое cgi-программирование. Что такое cgi-программа

    Как уже говорилось выше, CGI – это стандарт, или набор правил, определяющих , как Web-сервер и внешняя по отношению к нему программа общаются между собой.

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

    Как выполняются cgi-программы

    При поступлении запроса на CGI-программу возникает две задачи. Первая – это определить, что требуется выполнить именно CGI-программу, а вторая — это собственно ее выполнение. За первую задачу, за определение того, что выполнить, отвечает сервер, а за вторую – операционная система.

    Есть несколько способов различать запрос на выполнение программы и на передачу статического файла. Первый, самый распространенный способ – использование каталога cgi-bin. Все файлы в этом каталоге рассматриваются как программы, и при запросе на такой файл сервер пытается такой файл выполнить. Второй способ состоит в том, что сервер различает простые файлы и программы по расширению.

    Когда принято решение о том, что должна быть выполнена программа, вступает в действие операционная система. Она ведет себя так, как если бы имя программы было введено из программной строки.

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

    Через них передается приложению как служебная информация (версия программного обеспечения, доменное имя сервера и др.), так сами данные (в переменной QUERY_STRING). При методе POST для передачи используется стандартный ввод. А в переменных окружения фиксируется тип и длина передаваемой информации (CONTENT_TYPE и CONTENT_LENGTH). Для возврата данных серверу CGI-программа использует стандартный вывод.

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

    Обязательным для результатов вывода при генерировании документов «на лету», когда реального документа в файловой системе сервера не остается, является только HTTP-заголовок Content-type, в котором указывается тип возвращаемого документа для правильной интерпретации браузером. Обычно в Content-type указывают текстовые типы text/plain и text/html. При использовании такого вида скриптов следует учитывать, что не все серверы и клиенты отрабатывают так, как представляется разработчику. Так, при указании Content-type: text/html, некоторые клиенты не реализуют сканирования полученного текста на предмет наличия в нем встроенной графики.

    Читайте также:
    Split sound service что это за программа

    При применение спецификации CGI для обмена данными с внешними прикладными программами можно выделить следующие преимущества:

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

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

    Источник: studfile.net

    Что такое CGI-графика и где она используется

    Что такое CGI-графика

    Каждый год в прокат выходят тысячи фильмов, которые используют CGI-графику. Впервые она появилась в фильме «Мир Дикого Запада», вышедшем на экраны в 1973 году, а сегодня ее можно встретить практически в каждом фильме или сериале.

    Многие кинокритики скептически относятся к такой графике и часто говорят, что CGI убивает кино. Действительно ли CGI-графика так сильно портит фильмы и что это вообще такое? Давайте разбираться.

    Что такое CGI-графика

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

    Как я уже и говорил, CGI появилась в прошлом веке, сразу решив многие технические сложности. В фильме «Парк Юрского Периода (1993)» при помощи CGI удалось заменить каскадера. В том же фильме также удалось соединить CGI (кожа и мышцы динозавров были созданы при помощи компьютерной графики) с традиционной съемкой и аниматроникой.

    А что с компьютерными играми, спросите вы – в них же, наоборот, CGI используется редко. Как правило, в играх работает графика в реальном времени, а вот большинство внутриигровых видеороликов основаны на CGI.

    CGI – это не только фильм «Аватар» и «Железный человек», такая графика используется везде, где это уместно. Например, ее можно встретить в таких фильмах, как «Паразиты», «Кровавый алмаз», «Горбатая гора» и многих других. Например, в психологической драме «Черный лебедь» CGI используется крайне нетипично. Если вы видели этот фильм, то с ходу сможете вспомнить много очевидных сцен с компьютерной графикой. Но вы вряд ли заметили то, что в конце фильма у героини руки были не настоящие – их специально сделали более длинными и гладкими с помощью CGI-графики.

    В большинстве случаев хорошая CGI – это та CGI, которую зритель не замечает.

    Компьютерная графика в рекламе

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

    Все точно так же, как в киноиндустрии – есть реклама, которая полностью состоит из CGI. Например, недавняя реклама от «Сбер» с CGI-персонажами Чебурашкой и крокодилом Геной:

    Источник: e-sevenweb.ru

    Рейтинг
    ( Пока оценок нет )
    Загрузка ...
    EFT-Soft.ru