CGI - Common Gateway Interface
1.11.1999
Harri Tuomela
Tietotekniikan osasto
Teknillinen korkeakoulu
harri.tuomela@hut.fi
Tiivistelmä
Common Gateway Interface (CGI) on rajapinta, jota käytetään
yleisesti mahdollistamaan tiedonsiirto WWW-palvelinohjelman ja ajettavan
ohjelman välillä. Se on National Computational Science Alliance:n
(NCSA) kehittämä hieman löyhä standardi. Parametrien
siirtoon ohjelmien välillä CGI käytettää ympäristömuuttujia,
komentoriviargumentteja sekä standardi-sisäänmenoa ja -ulostuloa.
CGI-ohjelma voidaan toteuttaa millä tahansa kielellä, joka on
palvelimessa tuettuna. CGI antaa ulkopuolisille mahdollisuuden ajaa ohjelman
koneessa, joten turvallisuusnäkökohdat tulee ottaa huomioon.
HTML-lomakkeita voidaan käyttää CGI-ohjelmalle välitettävien
argumenttien keräämiseen. CGI:n yhteydessä voidaan käyttää
myös tekniikkaa, jolla palvelinohjelma tallentaa selaimelle tietyn
arvon, jonka se voi lukea myöhemmin (Cookies). Valmiita CGI-toteutuksia
on runsaasti ja omien toteutusten tekeminen on helppoa.
1 Johdanto
2 CGI-standardi
2.1 Versiointi
2.2 Ulkoiset rajapinnat
2.2.1 Ympäristömuuttujat
2.2.2 Komentoriviargumentit
2.2.3 Stdin
2.2.4 Stdout
2.3 Toteutuskieli
2.4 Turvallisuuskysymykset
3 HTML-lomakkeet
3.1 Yleistä
3.2 Peruskentät
4 Käytännön toteutukset
4.1 Ohjelmointikielet
4.1.1 Perl
4.1.2 Muut
4.2 Cookies
4.3 Valmiit toteutukset
4.4 Omat toteutukset
Lähdeluettelo
Lisätietoja
1 Johdanto
90-luvun alkupuolella Internetissä yleistynyt WWW-konsepti tarjosi
alunpitäen tavan, jolla tietoa voitiin siirtää erityisesti
konseptia varten suunniteltuja HTML-dokumentteja sekä muita tiedostoja
palvelinkoneilta asiakaskoneille. Tämä mahdollisti hyperlinkattujen
tekstien eli WWW-sivujen sekä niihin sisällytettyjen kuvien siirron,
jolloin sopivilla palvelin- ja asiakasohjelmilla sivuja voitiin vastaavasti
tarjota ja lukea, sekä hyperlinkattujen sivujen tapauksessa selata.
Konsepti ei kuitenkaan tarjonnut sinällään mahdollisuutta
kerätä tietoa asiakaskoneilta palvelinkoneille päin. Näin
ollen käyttäjäkunnalle suunnattuja interaktiivisia sivuja,
kuten asiakastutkimuksia, äänestyksiä tai muita valintaperusteisia
palveluita, ei voitu toteuttaa.
Tähän tarpeeseen suunniteltiin alunperin NCSA:n (engl. National
Computational Science Alliance) toimesta CGI-standardi (engl. Common
Gateway Interface). Sillä määriteltiin tapa, jolla asiakasohjelma
voisi liittyä tietopalveluihin.
CGI:tä on käytetty WWW:ssä yleiseseti HTTP:n (engl. Hypertext
Transfer Protocol) [4] yhteydessä välittämään
tietoa HTTP-palveliohjelman ja ajettavan ohjelman välisenä rajapintana.
Muuhun käyttöön CGI:tä ei juurikaan ole sovellettu.
Näinollen tässäkin tekstissä rajoitutaan tarkastelemaan
CGI:tä HTTP:n valossa.
CGI-rajapinta on toteutettu lähes kaikkiin yleisimpiin WWW-palvelinohjelmistoihin.
2 CGI-standardi
2.1 Versiointi
CGI-standardin määritelmää [5]
ylläpidetään tällä hetkellä NCSA:n toimesta.
Standardin nykyinen versio on 1.1. Standardi on NSCA:n ylläpitämä
ja se koostuu WWW-sivustosta, joka jättää määritelmän
melko löyhäksi. Tästä syystä nykyisestä versiosta
kirjoitetaan tarkempaa dokumenttia [2], joka on kuitenkin
luonnosvaiheessa. Samaan aikaan standardin versio 1.2 [3]
on tekeillä, mutta sekin on vasta luonnos. Tässä kappaleessa
tukeudutaan tällä hetkellä voimassaolevaan NCSA:n määritelmään
ja tuodaan esille siihen liittyvät pääkohdat.
2.2 Ulkoiset rajapinnat
2.2.1 Ympäristömuuttujat
Palvelinohjelma voi siirtää tietoa CGI-ohjelmalle mm. ympäristömuuttujien
avulla. Palvelinohjelma asettaa CGI-ohjelman ajon ajaksi määriteltyihin
ympäristömuutujiin arvot, jotka kuvaavat sen hetkistä tilannetta.
Määritelmässä on otettu kantaa yhdeksäntoista
määrätyn ympäristömuuttujan sisältöön.
HTTP-palvelinohjelmat määrittelevät yleensä vielä
enemmän muuttujia.
HTTP:n kannalta kaksi tärkeintä muuttujaa on esitelty tässä
yhteydessä.
-
REQUEST_METHOD - Tämä muuttuja kertoo, mitä tapaa
käyttäen pyynnön parametrit välitetään CGI-ohjelmalle.
HTTP:n yhteydessä yleisimmät tavat ovat GET, POST
ja PUT, joista ensimmäisessä parametrit välitetään
QUERY_STRING-ympäristömuuttjan
kautta ja jälkimmäisessä
stdin:n kautta.
-
QUERY_STRING - Siinä tapauksessa, että käytetään
GET-metodia,
parametrit välittyvät tämän ympäristömuuttjan
arvona CGI-ohjelmalle.
Pyynnön mukana välitettävien parametrien tarkempaa sisältöä
käsitellään luvussa 3.
2.2.2 Komentoriviargumentit
Parametreja voidaan välittää CGI-ohjelmalle myös
komentorivin argumenttien kautta. Tällöin palvelinohjelma ajaa
CGI-ohjelman ja antaa sille halutun argumentin. Huomioitavaa on, että
edellä mainitut ympäristömuuttujat ovat edelleen aseteltuna,
paitsi mahdollinen QUERY_STRING, jonka sisältö välitetään
komentoriviargumenttina.
HTTP:n yhteydessä parametrit voidaan välittää komentoriviargumenttina
ainoastaan siinä tapauksessa, että käytetään
HTML-lomakkeen ISINDEX-elementtiä. Sen käyttöä
ei kuitenkaan suositella HTML-suosituksen nykyisessä versiossa. Suositusta
on käsitelty tarkemmin luvussa 3.
2.2.3 Stdin
Parametriejä voidaan syöttää myös CGI-ohjelman
stdin:iin
(engl. Standard Input). HTTP:n yhteydessä tähän käytetään
metodeja POST ja PUT. Tällöinkin edellä
mainitut ympäristömuuttujat ovat asetettu, paitsi mahdollinen
QUERY_STRING,
jonka sisältö välitetään
stdin:iin.
2.2.4 Stdout
CGI-ohjelma antaa tulosteensa palvelinohjelmalle stdout:in (engl. Standard
Output) kautta. Ennen varsinaista dokumentin runkoa välitetään
otsikkokentissä tietoa dokumentista. Ensimmäinen tyhjä rivi
erottaa otsikkorivit rungosta.
Palvelinohjelma käsittelee otsikkokentät ja lähettää
tiedon selaimelle. CGI-ohjelma voi tulostaa minkä tahansa tyyppistä
tietoa. Selaimen vastuulle jää se, näytetäänkö
dokumentti käyttäjälle.
2.3 Toteutuskieli
Koska CGI-ohjelma on normaali ajettava ohjelma, se voidaan toteuttaa millä
tahansa kielellä, joka mahdollistaa ajettavien ohjelmien tekemisen
koneella, jossa palvelinohjelmaa käytetään. Määritelmässä
on lueteltu joitakin ohjelmointikieliä, mutta lopuksi todetaan, että
asia riippuu vain siitä, mitä toteutuskieliä järjestelmä
tukee.
Yleisesti käytetään tulkattavia kieliä, koska niitä
on helpompi korjata, modifioida ja ylläpitää johtuen siitä,
että ne toimivat kaikissa ympäristöissä, joihin tulkki
on asennettavissa, ja siitä, ettei niitä tarvitse joka kerta
erikseen kääntää.
Toteutuksesta kerrotaan lisää luvussa 4.
2.4 Turvallisuuskysymykset
Koska CGI-ohjelma on normaali ajettava ohjelma, on otettava huomioon myös
se tosiasia, että HTTP:n yhteydessä CGI-ohjelman asentaja antaa
mahdollisesti ulkopuolisille mahdollisuuden ajaa jonkun ohjelman omalla
koneella. Tämä on selvä turvallisuusriski ja siksi esimerkiksi
monen käyttäjän järjestelmissä ei käyttäjän
yleensä anneta oletusarvoisesti saattaa CGI-ohjelmiaan ajettavaksi
palvelinohjelman kautta. Yleinen käytäntö on pitää
CGI-ohjelmat tietyssä hakemistossa, jonne niitä voidaan lisätä
vain ylläpidon toimesta.
Yleisesti on vältettävä ohjelmointitapoja, joidenka johdosta
CGI-ohjelman käyttäjä voisi ajaa mielivaltaisia systeemikomentoja
ohjelman kautta.
3 HTML-lomakkeet
3.1 Yleistä
HTML (engl. Hypertext Markup Language) on W3C:n (engl. World Wide Web Consortium)
suositus, joka määrittelee WWW:ssä käytetyn tavan toteuttaa
hyperlinkattuja dokumentteja. Kieli ei tosin nimenstä vastaisesti
ole aito hypertekstikieli, sillä se ei määritä tapaa,
jolla dokumentista voitaisiin palata takaisin edelliseen dokumenttiin.
W3C:n suosituksen tämänhetkinen versio on versio numero neljä,
[6]. Tämän dokumentin alkuperäinen kieli
on HTML.
HTML:llä voidaan toteuttaa myös lomakkeita, joilla annetaan
syötteitä CGI-ohjelmille. Lomakkeiden kentille annetaan nimet
ja ne välitetään muuttujien kanssa nimi-arvo -pareina valitulla
metodilla palvelinohjelman kautta CGI-ohjelmalle. Arvot yhdisteään
nimiin yhtäsuuuruusmerkillä (=) ja parien erottamiseen
käytetään ja-merkkiä (&). Parit muunnetaan
niin, etteivät ne sekoitu yhdistävien ja erottavien merkkien
kanssa.
3.2 Peruskentät
Seuraavassa on esitelty HTML:n yleisimmin käytetyt kenttätyypit.
Koska tämän dokumentin kieli on HTML, jokaisesta tyypistä
voidaan antaa myös esimerkki.
Kentät voidaan yhdistää yhdeksi kokonaisuudeksi, lomakkeeksi,
jolle voidaan antaa URI (engl. Uniform Resource Identifier) eli lomakkeen
käsittelevän CGI-ohjelman sijainti, parametrien välittämiseen
käytetty metodi ja joukko muita arvoja.
4 Käytännön toteutukset
4.1 Ohjelmointikielet
4.1.1 Perl
CGI-toteutus, kuten luvussa 2.3 mainittiin,
voidaan tehdä halutulla ohjelmointikielellä. Samassa yhteydessä
mainittiin myös siitä, että tulkattavat kielet ovat saaneet
suuren suosion niiden helppokäyttöisyyden johdosta. CGI:n yhteydessä
käytettävistä tulkattavista kielistä yleisin lienee
Perl (engl. Practical Extraction and Report Language) [1],
jonka tehokas syntaksi ja ominaisuudet merkkijonon käsittelyssä
ovat omiaan korostamaan sen asemaa. Perlin tehokkuudesta tässä
yhteydessä kertoo jotain jo sekin, että täysin toimiva HTTP-palvelinohjelmisto
voidaan toteuttaa muutamalla Perl-rivillä.
Perlille on tehty myös joitakin valmiita CGI-rajapinnan toteuttavia
ohjelmamoduleita, jotka ovat julkisesti saatavilla. Niiden avulla ohjelmoija
voi suoraan manipuloida CGI-rajapinnassa liikkuvaan tietoa erilaisilla
komennoilla eikä hänen tarvitse vaivautua esim. tekemään
merkkimuunnoksia, jotka mainittiin luvun 3.1 lopussa.
Myös lukuisia muita moduleita on toteutettu, joiden avulla ohjelmoija
voi helposti käsitellä erilaisia protokollia, dokumenttityyppejä,
salausjärjestelmiä jne. Näitä voi hyödyntää
CGI-ohjelmissa.
Perlin dokumentaatio on hyvä. Siitä on kirjoitettu kirjoja
ja tehty erilaisia manuaalisivuja.
4.1.2 Muut
Muitakin CGI-ohjelmointiin käytettyjä kieliä on. TCL (engl.
Tool Comman Language) on interaktiivisten ohjelmien tekoon tarkoitettu
kieli, joka siinä merkityksessä sopii hyvin myös CGI-ohjelmointiin.
Unix-koneiden mukana toimitettava Bourne- tai Posix-Shell ovat skriptikieliä,
joilla voidaan helposti toteuttaa yksinkertaisia CGI-ohjelmia. Vaikka C
ja C++ ovatkin käännettäviä kieliä eivätkä
ne ilman lisäkirjastoja tarjoa kovin helppoa tapaa toteuttaa CGI-ohjelmia,
on niiden merkitys tässäkin yhdeydessä huomioitava johtuen
niitten yleisyydestä kaikessa ohjelmoinnissa, mukaan lukien CGI-ohjelmointi.
4.2 Cookies
Cookies on alunperin Netscapen kehittelemä tekniikka, jolla WWW-palvelin
voi lähettää tiedon selaimelle niin, että sitä
voidaan käyttää myöhemmin. Tätä voidaan käyttää
esimerkiksi Internet-kauppojen toteutuksissa tallentamaan tietoa siitä,
mikä on minkäkin asiakkaan ostoskori. Näin ollen asiakas
voi kerätä samaan virtuaalikoriin tavaroita koko ostotapahtuman
ajan ja lopuksi suorittaa varsinaisen ostamisen.
CGI-ohjelmilla Cookies-muutujat voidaan lähettää selaimelle
luvussa
2.2.4 mainituissa otsikkokentissä. Myöhemmin ohjelma voi
lukea selaimen Cookies-luetteloa HTTP_COOKIE-ympäristömuuttujan
avulla. Palvelinohjelma asettaa tämän muuttujan muiden luvussa
2.2.1 mainittujen muuttujien lisäksi.
Cookies-tekniikasta on saatavilla lisätietoja.
4.3 Valmiit toteutukset
WWW:ssä on käytössä lukemattomia CGI:tä hyödyntäviä
ohjelmia, joista osa on tuotteistettu tai muuten vaan tarjolla uudelleenkäytettäväksi.
Tällaisia ovat mm. erilaiset äänestysrobotit, palautekyselyt,
WWW-pohjaiset sähköpostipalvelut. Lisätietojen yhteydessä
on annettu muutama linkki, joiden avulla voi hakea tarvitsemansa tyyppistä
ohjelmaa.
4.4 Omat toteutukset
Omien toteutusten teko kannattaa aloittaa opettelemalla ohjelmoimaan, esim.
Perlillä. Perl on helppo asentaa ja siitä löytyy valmiiksi
käännetyt versiot useille eri käyttöjärjestelmille.
CGI-ohjelmointiin voi tutustua erilaisten aiheesta kirjoitettujen artikkeleiden
avulla. Katso lisätiedoista. Tämän
lisäksi tarvitaan vielä WWW-palvelinohjelma, joka toteuttaa CGI-rajapinnan.
Suosituin WWW-palvelin lienee Apache. Tässä yhteydessä merkittävä
on myös W3C:n Jigsaw, joka tukee uusimpia W3C:n suosituksia ja on
helppokäyttöinen. Katso myös näihin liittyvät
lisätiedot.
Lähdeluettelo
| [1] |
Christiansen, T., Practical Extraction and Report
Language, 23.8.1998 [viitattu 1.11.1999]
< http://www.cpan.org/doc/manual/html/pod/perl.html
> |
| [2] |
Coar, K. A. L., Common Gateway Interface - 1.1 *Draft
03*, 25.6.1999 [viitattu 1.11.1999]
< http://Web.Golux.Com/coar/cgi/draft-coar-cgi-v11-03-clean.html
> |
| [3] |
Coar, K. A. L., Common Gateway Interface - 1.2 *DRAFT*,
29.5.1998 [viitattu 1.11.1999]
< http://Web.Golux.Com/coar/cgi/cgi-120-00a.html
> |
| [4] |
Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
Masinter, L., Leach, P., Berners-Lee, T., Hypertext Transfer Protocol --
HTTP/1.1, [viitattu 1.11.1999]
< ftp://ftp.ietf.org/rfc/rfc2616.txt
> |
| [5] |
The National Computational Science Alliance (NCSA), The
Common Gateway Interface, 7.11.1996 [viitattu 1.11.1999]
< http://hoohoo.ncsa.uiuc.edu/cgi/
> |
| [6] |
Raggett, D., Le Hors, A., Jacobs, I., HTML 4.0 Specification,
24.4.1998 [viitattu 1.11.1999]
< http://www.w3.org/TR/REC-html40/
> |
Lisätietoja
-
ABC's
of CGI, The
-
Matt Rotterin käytännönläheinen artikkeli CGI-ohjelmoinnin
perusteista
-
Apache Project
-
Erittäin yleisesti käytetyn WWW-palvelinohjelman kotisivu
-
CGI - Common Gateway Interface
-
W3C:n linkkilista CGI:hin littyvistä linkeistä
-
CGI Directory, The
-
Hakemisto, jossa on satoja valmiita CGI-ohjelmia
-
CGI Resource Index, The
-
Hakmisto, jossa on tuhansia CGI:hin liittyviä resursseja.
-
Cookie Central
-
Hakemisto, joka tarjoaa tietoa Cookies-teknologiasta
-
HTTP State Management Mechanism
-
HTTP:hen liittyvä dokumentti, jossa määritellään
HTTP:n toiminnot, joiden avulla Cookies-tekniikka on voitu toteuttaa
-
Hypertext Markup Language
- 2.0
-
HTML:n edellinen käyttöönotettu versio
-
JavaScript
Guide - Netscape Cookies
-
Netscapen Cookies-sivu
-
Jigsaw - The W3C's Web Server
-
W3C:n WWW-palvelinohjelman kotisivu