Кіріспе

Веб-серверлер мен сыртқы бағдарламалар арасындағы интерфейс

Компьютерлік есептемелерде, Common Gateway Interface (CGI) – веб-серверлерге HTTP немесе HTTPS пайдаланушы сұраныстарын өңдеу үшін сыртқы бағдарламаны іске қосуға мүмкіндік беретін интерфейс спецификациясы. Мұндай бағдарламалар көбінесе скрипт тілінде жазылады және әдетте CGI скрипттері деп аталады, бірақ олар компиляцияланған бағдарламаларды да қамтуы мүмкін. Типик қолданыс жағдайы – веб-пайдаланушы CGI қолданатын веб-бетте веб-форманы жіберген кезде туындайды. Форманың деректері веб-серверге CGI скриптін көрсететін URL мекенжайы бар HTTP сұранысы арқылы жіберіледі. Веб-сервер жаңа компьютерлік процесте CGI скриптін іске қосып, оған форма деректерін жібереді. CGI скрипті өзінің нәтижесін, әдетте HTML түрінде, веб-серверге қайтарады, ал сервер оны браузердің сұрауына жауап ретінде браузерге жібереді. 1990 жылдардың басында жасалған CGI веб-беттің интерактивті болуына мүмкіндік берген алғашқы кең таралған әдіс болды. Клиенттен сұраныс келген сайын CGI скрипттерін әрқашан жеке процесте іске қосу қажеттілігіне байланысты, түрлі баламалар әзірленді.

Тарих

1993 жылы Ұлттық суперкомпьютерлік қосымшалар орталығы (NCSA) командасы www talk пошталық тізімінде командалық жолды орындауға шақырудың ерекшеліктерін жазды. Басқа веб-серверлерді жасаушылар оны қабылдады және ол уақыттан бері веб-серверлер үшін стандарт болып табылады. Кен Коар төрағалық еткен жұмыс тобы 1997 жылдың қарашасында NCSA-ның CGI анықтамасын формальды түрде анықтауға кірісті. Бұл жұмыс RFC 3875-те пайда болды, онда CGI 1.1 нұсқасы көрсетілген. RFC-де келесі үлескерлер нақты аталады: Мысалы, егер веб-серверде толық білікті домен атауы www.example.com болса, және оның құжат жинағы жергілікті файл жүйесінде /usr/local/apache/htdocs/ (оның құжат түбірі) сақталады, содан кейін веб-сервер http://www.example.com/index.html сұрауына /usr/local/apache/htdocs/index.html файлының көшірмесін браузерге жібереді (егер ол бар болса). Ұшқанда құрылатын беттер үшін серверлік бағдарламалық қамтамасыз ету бағдарламаларды бөлектеу туралы сұрауларды кейінге қалдырып, нәтижелерді сұрау салушы клиентке (әдетте, бетті соңғы пайдаланушыға көрсететін веб-браузерге) жібере алады. Мұндай бағдарламаларға әдетте сұрау салумен бірге сұрау саптары немесе cookie файлдары сияқты қосымша ақпараттар қажет. Керісінше, қайтару кезінде скрипт HTTP-ге сұранысқа жауап беру үшін қажетті барлық ақпаратты: сұраныстың HTTP-күйін, құжат мазмұнын (бар болса), құжат түрін (мысалы, HTML, PDF немесе жай мәтін) және т.б. ұсынуы керек. Бастапқыда браузер, ол қарым-қатынас жасайтын HTTP сервері және деректерді өңдеуге және ақыр соңында браузерге нәтиже қайтаруға күтілетін сервердегі скрипттер арасында деректер алмасудың стандартталған әдістері болмаған. Нәтижесінде әртүрлі HTTP серверлері арасында өзара үйлеспеушіліктер болды, бұл скрипт тасымалдауға кедергі келтірді. Бұл мәселені мойындау деректерді алмасудың нақтылауына әкелді, нәтижесінде CGI жасалды. CGI ерекшелігіне сәйкес келетін серверлік бағдарламалық жасақтамамен шақырылған веб-беттерді құру бағдарламалары CGI скрипттері деп аталады, тіпті олар шын мәнінде скриптілік емес тілдерде жазылған болса да, мысалы C. CGI ерекшелігі тез қабылданған және Apache, Microsoft IIS және (ұзартумен) Node.js негізделген серверлер сияқты барлық белгілі HTTP серверлік пакеттер қолдауымен жалғасуда. CGI скрипттерін бастапқыда нысандарды өңдеу үшін қолданған. HTML-нің басында HTML формаларында әдетте "action" атрибуты және "submit" батырмасы ретінде белгіленген батырма болған. "Submit" батырмасын басқан кезде "action" атрибутында көрсетілген URI сұраныс тізбегі ретінде жіберілген нысандағы деректермен серверге жіберіледі. Егер "action" CGI скриптін белгілесе, онда CGI скрипті орындалады, скрипт өз кезегінде HTML бетті жасайды.

Қатысу

CGI қолдауы бар веб-серверді, оның қызмет ететін URL-ін CGI скриптіне сілтеме ретінде түсіндіру үшін конфигурациялауға болады. Көптеген жағдайларда, каталог ағашының түбінде cgi-bin/ каталогы болады және осы каталогтағы барлық орындалатын файлдар (және басқа ешқандай файл емес, қауіпсіздік үшін) CGI скрипттері ретінде қарастырылады. Веб-браузер CGI каталогындағы файлға сілтеме беретін URL-ді сұрағанда (мысалы, http://example.com/cgi-bin/printenv.pl/with/additional/path?and=a&query=string), HTTP сервері сол файлды (/usr/local/apache/htdocs/cgi-bin/printenv.pl) веб-браузерге жібермей, көрсетілген скриптті орындайды және скрипттің нәтижесін веб-браузерге жібереді. Яғни, скрипт стандартты шығысқа жіберген кез келген мәлімет веб-серверді іске қосқан терминал терезесінде көрсетілмей, веб-клиентке беріледі. Тағы бір кең таралған тәсіл – файлдың кеңейтімін пайдалану. Мысалы, егер CGI скрипттеріне әрдайым cgi кеңейтімі берілсе, веб-сервер осындай барлық файлдарды CGI скрипттері ретінде түсіндіруге конфигурациялануы мүмкін. Бұл ыңғайлы, сондай-ақ көптеген алдын ала дайындалған скрипттерде қажет, бірақ егер қашықтан қолданушы дұрыс кеңейтіммен орындалатын кодты жүктей алса, ол серверді шабуылға ұшыратуы мүмкін. CGI спецификациясы сұраныспен бірге жіберілген қосымша ақпараттың скриптке қалай берілетінін анықтайды. Веб-сервер орта айнымалыларының бір бөлігін жасайды және HTTP ортасына қатысты деректерді қосады. Мысалы, егер URL-дің скрипт атауынан кейін бірден коса сызық пен қосымша каталогтардың атаулары қосылса (бұл мысалда, /with/additional/path), онда бұл жол скрипт шақырылғанға дейін PATH_INFO орта айнымалысында сақталады. Егер параметрлер HTTP GET сұранысы арқылы скриптке жіберілсе (URL-ге сұрақ белгісі қосылып, содан кейін param=value жұптары; мысалы, ?and=a&query=string), онда бұл параметрлер скрипт шақырылғанға дейін QUERY_STRING орта айнымалысында сақталады. HTTP POST сұранысы арқылы жіберілген форма параметрлері сияқты HTTP хабарламасының мәтіні скрипттің стандартты кірісіне жіберіледі. Скрипт осы орта айнымалыларын немесе стандартты кірістен алынған деректерді оқи алады және веб-браузердің сұранысына бейімделеді.

Қолданылуы

CGI көбінесе пайдаланушыдан кіріс ақпаратты өңдеу және тиісті нәтижені шығару үшін қолданылады. Мысалы, викиді іске асыратын бағдарлама – CGI бағдарламасы болып табылады. Егер пайдаланушы агенті жазбаның атын сұраса, веб-сервер CGI бағдарламасын іске қосады. CGI бағдарламасы сол жазбаның бетінің бастапқы кодын (егер бар болса) алады, оны HTML форматына түрлендіреді және нәтижені шығарады. Веб-сервер CGI бағдарламасынан алынған нәтижені қабылдайды және оны пайдаланушы агентіне жібереді. Пайдаланушы агенті "Бетті өңдеу" батырмасын басқанда, CGI бағдарламасы HTML мәтіндік өрісін немесе басқа өңдеу құралын беттің мазмұнымен толтырады. Соңында, егер пайдаланушы агенті "Бетті жариялау" батырмасын басқанда, CGI бағдарламасы жаңартылған HTML кодын сол жазбаның бетінің бастапқы кодына түрлендіріп, сақтайды.

Қауіпсіздік

CGI бағдарламалары әдетте веб-сервердің қауіпсіздік контекстінде орындалады. Алғаш пайда болғанда, NCSA, Apache және CERN веб-серверлерінің бастапқы дистрибутивтерімен бірге жаңа CGI-ді пайдалану үшін қабық скрипттерін немесе C бағдарламаларын қалай жазуға болатынын көрсету мақсатында бірнеше мысал скрипттері ұсынылды. Мұндай скрипттердің бірі – қарапайым телефон анықтамасын іске асырған PHF деп аталатын CGI бағдарламасы. Көптеген басқа скрипттер сияқты, бұл скрипт те escape shell cmd функциясын қолданды. Бұл функция пайдаланушы енгізген деректерді тазалауға және осы деректерді веб-сервердің қауіпсіздік контекстінде орындалу үшін Unix қабығына жіберуге арналған еді. Бірақ скрипт барлық деректерді дұрыс тазаламады және қабыққа жаңа жолдарды жіберуге мүмкіндік берді, бұл бірнеше команданы орындауға әкеп соқты. Осы командалардың нәтижелері веб-серверде көрсетілді. Егер веб-сервердің қауіпсіздік контексі рұқсат берсе, шабуылшылар зиянды командаларды орындай алатын еді. Бұл веб-серверде кодты орындауға мүмкіндік беретін, веб-пайдаланушылардан алынған тазаланбаған деректер арқылы жасалатын код инъекциясы деп аталатын жаңа типтегі веб-шабуылдың алғашқы кең таралған мысалы болды. Мысал код әдепкі бойынша орнатылғандықтан, шабуылдар кеңінен тарады және 1996 жылдың басында бірқатар қауіпсіздік ескертулеріне әкелді.