Common Gateway Interface (CGI)

A CGI (általános átjáró felület) segítségével elérhetjük, hogy alkalmazásainkhoz a World Wide Web-en keresztül kínáljunk fel egy elérési felületet. A kommunikáció HTML oldalakon keresztül zajlik, programunkat így akárhonnan vezérelhetjük ahol van Internet kapcsolatunk.

CGI program segítségével - az előre definiált statikus HTML lapokhoz képest - dinamikus információkat jeleníthetünk meg. Dinamikus információ minden, ami időben vagy a lekérések számától, esetleg a lekérő klienstől függően változik. CGI-n keresztül oldhatunk meg tehát rengeteg dolgot az egyszerű számlálóktól kezdve a bonyolult kérdőív-feldolgozó és kereső feladatokig.

A CGI nem egy programnyelv, a CGI csak egy felület, amin keresztül a programunk a HTTP-szerverrel kommunikál. Ebből következik, hogy bármilyen, a szerveren futó program képes CGI-t használni, így tehát HTML oldalakat előállítani, az azokon felmerült igényeket kiszolgálni.

A CGI programok léte gyakorlatilag azt jelenti, hogy létezik egy program a szerverünkön, amit az egész világ futtathat. Ez azonban nem a legbiztonságosabb dolog, a programban előfordulhatnak olyan hibák, amik bekövetkezési valószínűsége nagyon kicsi, de ezt kihasználva ártó szándékkal betörhetnek rendszerünkbe. Ezt megnehezítendő a legtöbb szerver beállítható úgy, hogy csak egy könyvtárban lehessenek CGI programok. Így természetesen a veszély nem szűnik meg, csak csökken, mivel értékes dokumentumok és más adatok nincsenek ebben a könyvtárban. Ez a könyvtár a legtöbb rendszeren a szerver főkönyvtárából nyíló cgi-bin könyvtár.
CGI programot bármilyen nyelven írhatunk, ami elérhető az adott rendszeren. A CGI programokat nem olyan egyszerű tesztelni, mint a HTML lapokat, vagy az abba ágyazható JavaScript rutinokat. Itt egy böngészőn kívül szükségünk van egy működő HTTP szerverre vagy egy lokális Web szerverre is, ami képes CGI kezelésére. Ehhez nem kell állandó Internet-kapcsolattal rendelkeznünk, ugyanis a legtöbb szerver beállítható lokális üzemmódra is. Ilyenkor a gépünknek egy fenntartott IP címe lesz (ez az úgynevezett „localhost", a helyi gép megfelelője), amin keresztül tudunk kommunikálni a szerverrel.

Alapok

CGI programok futtatására több módszer is létezik. Ezek közül az adott feladatnak leginkább megfelelőt válasszuk ki. A lehetőségek:

Link elhelyezése - Ez a legegyszerűbb megoldás. Egyszerűen egy <A> elemmel hivatkozást hozunk létre, ami nem egy HTML oldalra, hanem CGI programra mutat. Így a program feladata előállítani a megfelelő HTML lapot bizonyos adatok függvényében. Ez a módszer jól alkalmazható például keresőprogramoknál.

Grafikus állományként hivatkozás - Ennek a módszernek az a lényege, hogy a már ismert <IMG> elem SRC paraméterénél nem egy képre, hanem CGI programra hivatkozunk. Így az adott CGI program feladata előállítani vagy kiválasztani, majd elküldeni a képet a megjelenítőnek. Erre a módszere van szükségünk például grafikus számlálók vagy véletlenszerű képek megjelenítésénél.

Kérdőív feldolgozása - A kérdőívet definiáló <FORM> tag ACTION paraméteréhez beírhatjuk a CGI program nevét. Ilyenkor a kérdőív adatait a megjelenítő elküldi a szervernek, pontosabban az azon futó CGI programnak, ami elvégzi a feldolgozást és esetleg egy válaszlapot küld vissza a megjelenítőnek. Ez a CGI scriptek egyik leggyakoribb alkalmazási módja.

Szerver-oldali beillesztés - A többi módszerrel ellentétben ezt nem minden szerver támogatja. Segítségével HTML lapokon megjegyzések közt elhelyezhetünk olyan utasításokat, amiket a szerver végrehajt, mielőtt elküldené a lapot a kliensnek. Ezen utasítások egyikével CGI programokat hajthatunk végre, amelyek kimenete ilyenkor a HTML lapra, az őket hívó utasítás helyére kerül. Jól használható olyan esetekben, amikor minden olvasói interakció nélkül szeretnénk CGI programokat hívni.

Minden alkalommal, amikor hivatkozás történik egy CGI programra, akkor az valós időben lefut, kimenete többé-kevésbé a böngésző által megjelenített lapra kerül. A CGI programok bemenetüket különböző, a szerver által beállított környezeti változókból kapják. Ezen környezeti változók információt adnak a kérést küldő megjelenítőről, a CGI programot futtató szerverről. Két módon küldhetünk adatot a szervernek, az egyik a GET, a másik a POST eljárás.

A GET eljárás a küldött adatokat az URL-hez kapcsoltan továbbítja, a program neve után egy kérdőjellel választva el az adatokat a címtől. Az adatok név-érték párokba rendezve kerülnek át a szerverre. Az így elküldött adatokat a QUERY_STRING nevű környezeti változóból nyerhetjük ki.

A POST metódus a program standard bemenetére küldi az adatokat. Itt is rendelkezünk kiegészítő információkkal, a CONTENT_LENGTH paraméter az elküldött adatok hosszát adja meg, így megállapíthatjuk, hogy hány karaktert kell olvasnunk a standard bemenetről. Erre azért van szükség, mert az átküldött adatok nem tartalmaznak semmilyen lezáró karaktert.

A GET eljárást akkor alkalmazzuk, amikor olyan feladattal találkozunk, ahol a kérés ismételt elküldése nem okoz gondokat a program futásában. Ilyen eset lehet például egy vendégkönyv vagy párbeszéd-oldal kialakítása, ahol egy-egy frissítési igény a kérés ismételt elküldésével valósul meg. Figyelembe kell venni azt is, hogy a GET eljárással elküldött adatok láthatók lesznek az URL-ben, így lehetőleg ne küldjünk titkolandó adatot GET módszerrel...

A POST eljárást egyszer elküldendő adatokra célszerű alkalmazni, a kérdőívek többsége általában ilyen megoldást igényel.

Adatokat a szerverről a kliensnek a CGI program standard kimenetén keresztül küldhetünk. Itt két teendőnk van: közölni a böngészővel, hogy milyen adatokat akarunk küldeni, és elküldeni magát az adatokat. A fejlécet a tényleges adatoktól két soremelés karakter választja el. A minimális fejlécben csak az elküldött adatok MIME típusát kell jeleznünk.
Ezek alapján tehát ha egy HTML lapot szeretnénk küldeni a CGI programunkból, ezeket a sorokat kell kiírassuk az éppen használt programnyelv utasításaival:

Content-type: text/html

<HTML>

… ide jön a lap leírása

</HTML>

Jegyezzük meg a külön soremelés szükségességét, és a laptípusra vonatkozó kulcsszó használatát, mert ezek nélkül nem tudunk a böngésző által megjelenített lapra írni.

Környezeti változók

A környezeti változók a szerverről és a kliensről szolgáltatnak adatokat. A környezeti változók kétfélék lehetnek: lekéréstől függetlenek és lekéréstől függőek.

Lekérésektől független változók

Ezeket a változókat a szerver minden egyes lekérésnél beállítja. A változók:

SERVER_SOFTWARE - a kiszolgálón található szerver-program neve.

SERVER_NAME - a szerver neve vagy IP címe, olyan formában, ahogy a saját oldalra hivatkozó URL-ekben megjelenne.
Példa: www.szerver.hu

GATEWAY_INTERFACE - a szerver által ismert és kezelt CGI változat verziója. Formátuma: CGI-verzió. Példa:CGI/1.1

Lekéréstől függő változók

Ezek a változók minden egyes lekérésnél külön értéket kapnak. Innen nyerhetjük a legtöbb hasznos információt.

A változók:

SERVER_PROTOCOL - A kommunikáció során használt protokoll verziója. Formátuma: protokoll/verzió. Például: HTTP/1.1

SERVER_PORT - Annak a portnak a sorszáma, ahonnan a kérés érkezett. A legtöbbször ez a 80-as port.

REQUEST_METHOD - A kérés által használt eljárás. HTTP protokoll esetén ez például GET, HEAD, POST.

PATH_INFO - Amennyiben a CGI program nevét mint virtuális könyvtárnevet használjuk és a programnév után további alkönyvtárakat adunk meg, akkor ez az információ itt tárolódik el. Példa: /kepek/kep.jpg

PATH_TRANSLATED - Az előző változó által hivatkozott fájl vagy könyvtár szerveren levő helye.

SCRIPT_NAME - A hivatkozott program virtuális helye. Itt nem az előző változónál látható, szerverhez igazodó könyvtárnevet kapunk, hanem azt az URL-t amelyikkel a programra hivatkozunk. Példa: /cgi-bin/feldolgoz.cgi

QUERY_STRING - Az az információ, ami az URL-ben a ? után következik. A GET típusú adatküldésnél innen nyerhetők ki az elküldött információk.

REMOTE_HOST - A kérést küldő kliens neve. Amennyiben ez nem elérhető, ennek a változónak üresnek kell maradnia, és a következő változó szolgáltat információt a kliensről. Például: ppp01.szolgaltato.hu

REMOTE_ADDR - A kérést küldő kliens IP címe. Ez a változó mindenképpen kap értéket. Példa: 123.226.35.10

AUTH_TYPE - Amennyiben a szerver támogatja a hitelesítést és a script ezt igényli, itt kaphatjuk meg, hogy milyen protokoll-függő hitelesítési módszert használ a felhasználó hitelesítésére.

REMOTE_USER - Ha a felhasználó átlépett a hitelesítési folyamatom, itt található az a felhasználói név, amit az olvasó használt belépéskor. Például: guest, administrator.

REMOTE_IDENT - Ha a HTTP szerver támogatja az RFC 931-es sorszámú specifikációban leírt azonosítási folyamatot, akkor ez a változó tartalmazza a felhasználó bejelentkezéskor használt nevét.

CONTENT_TYPE - Az olyan kéréseknek, amelyekhez információ is csatlakozik, a csatolt információ MIME típusát írhatjuk itt le. Példa: application/x-www-form-urlencoded (ez az URL-kódolás típusa).

CONTENT_LENGTH - A csatolt információ karakterekben mért hossza.

Kliens fejlécből érkező változók

Ezek a változók kliensenként és szerverenként változnak. Itt közölnek a böngészők különböző információkat magukról a szervernek. A szerver ezeket az információkat átadja a CGI programoknak és elé illeszti a "HTTP_" karaktersorozatot. Minden fejlécben levő "-" karaktert "_" karakterre cserél a kompatibilitás érdekében.

Például:

HTTP_ACCEPT - Azokat a MIME típusokat sorolja itt fel a böngésző, amelyeket kezelni tud. Példa: image/gif, image/jpeg

HTTP_USER_AGENT - A megjelenítő program nevét és verzióját kaphatjuk itt meg, ezek után esetleg zárójelek közt a megjelenítőt futtató operációs rendszer adatait.

HTTP_REFERER - Ebben a változóban küldheti el a böngésző az előző dokumentum címét.

Parancssor

A parancssorba történő adatküldés esetén a CGI programot a parancssorból valamilyen paraméterekkel hívjuk meg. Ezeket a paramétereket ez esetben a kliens oldalon levő megjelenítő küldi a CGI programnak.

Ezt a fajta adatküldést csak az ISINDEX típusú kérések esetében használhatjuk. Mivel az ilyen kéréseknél is a QUERY_STRING tartalmazza az elküldött adatokat, ezért a szerver úgy állapítja meg, hogy ISINDEX típusú kérésről van-e szó, hogy kódolatlan "=" jelet keres a QUERY_STRING változóban. Ha talál ilyet, akkor nem használja a parancssort adatküldésre.

A parancssorba történő adatküldésnél az URL-dekódolást a szerver elvégzi, így a parancssorba már a visszakódolt információ érkezik. Amennyiben a szerver valamilyen ok miatt nem tudja a parancssorba küldeni az adatokat, akkor nem küld semmit a parancssorba,és minden információ a QUERY_STRING változóból lesz elérhető.

Standard bemenet

Azon küldési módok esetén, amikor a szervernek küldött fejléchez még adatok is kapcsolódnak, a szerver ezeket az információkat a CGI program standard bemenetére küldi. A küldött adatok hossza a CONTENT_LENGTH, típusa a CONTENT_TYPE környezeti változókból kapható meg.

Standard kimenet

A CGI programok kimenete nem kerül közvetlenül a kliensre, azt előbb a szerver feldolgozza és ő küldi el a megjelenítőnek. Ez sajnos nem jelenti azt, hogy ne kellene minimális fejléccel ellátnunk adatainkat, de a szerver program a munka nagyobb részét leveszi a vállunkról. A fejléceket két soremelés zárja. Három általunk megadható fejléctípust tartalmaz a specifikáció, ezek:

Content_type: - Ez a paraméter a küldött adatok MIME típusát közli a klienssel. Ez az egyetlen mindenképpen szükséges paraméter.

Location: - Ezzel azt közöljük a szerverrel, hogy nem egy dokumentumot, hanem csak egy dokumentumra mutató hivatkozást küldünk el. Itt egy URL megadásával a kliensek általában rögtön letöltik a hivatkozott anyagot.

Status: - Ezzel a paraméterrel egy HTTP szabvány státuszsort küldhetünk a megjelenítőnek. Ez egy háromjegyű számból és egy szöveges üzenetből áll, ami a válasz kódját és leírását tartalmazza. Például: Status: 200 OK

Bálint Aliz - b_alyzka@freemail.hu