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ó
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.
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
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.
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
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
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.
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.
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
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.
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