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

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.
Selitys Esimerkki
input, type=text
kenttä, johon voidaan kirjoittaa yhdelle riville vapaamuotoista tekstiä
input, type=password
kuten edellinen, mutta kirjoitetut merkit eivät näy käyttäjälle
input, type=checkbox
kytkin, jolla voidaan valita jonkun ehdon toteutuminen
input, type=radio
kytkin, jolla voidaan toteuttaa yhden ehdon toteutuminen useammasta
input, type=submit
nappi, jolla lomake voidaan lähettää palvelimen välitettäväksi CGI-ohjelmalle
(Ei luultavasti toimi tässä yhdeydessä.)
input, type=reset
nappi, jolla voidaan palautta lomakkeen alkuperäiset arvot
select - option
valikko, jolla voidaan valita jokin tietty asia useamman joukosta
textarea
useampirivinen tekstikenttä, jonon voi kirjoittaa vapaamuotoista tekstiä

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