Kai kviečiamos CGI programos, jų naudojamą informacija, galima suskaidyti į tris dalis:
Diduma informacijos apie klientą, serverį ar vartotoją gaunama naudojant CGI aplinkos kintamuosius. Formų duomenys yra įjungiami į aplinkos kintamuosius arba įtraukiami į užklausos "kūną", o papildoma kelio informacija taip pat perduodama naudojant aplinkos kintamuosius.
Toliau šiame skyriuje panagrinėsime keletą paprastų programų, kurios naudoja duomenų įvedimą
2.1. Aplinkos kintamieji
Svarbiausia informacija, naudojama CGI programų, gaunama naudojant UNIX'o aplinkos kintamuosius. Perle tam naudojamas masyvas %ENV. Lentelėje 2.1 pateiktas pilnas aplinkos kintamųjų sąrašas, naudojamas CGI.
Lentelė 2.1 Aplinkos kintamieji
Aplinkos kintamasis |
Apibrėžimas |
GATEWAY_INTERFACE | Serverio naudojamo CGI peržiūra |
SERVER_NAME | Serverio IP adresas arba vardas (hostname) |
SERVER_SOFTWARE | Serverio naudojamos programinės įrangos pavadinimas ir versija |
SERVER_PROTOCOL | Informacijos protokolo, iš kurio atėjo užklausa, pavadinimas ir peržiūra. |
SERVER_PORT | Porto, kurį naudoja serveris, numeris |
REQUEST_METHOD | Metodas, kuriuo išsiunčiama užklausos informacija |
PATH_INFO | Papildoma kelio informacija, pridedama prie CGI programos |
PATH_TRANSLATED | Išversta kelio versija, gauta naudojant PATH_INFO. |
SCRIPT_NAME | Virtualus kelias (pvz. /cgi-bin/program.pl) iki vykdomos programos |
DOCUMENT_ROOT | Direktorija, kurioje randasi naudojami Web dokumentai |
QUERY_STRING | Užklausos, pateiktos programai, informacija. Ji pridedama prie URL su "?" |
REMOTE_HOST | Nutolusio vartotojo, atliekančio užklausą, vardas (hostname) |
REMOTE_ADDR | Nutolusio vartotojo, atliekančio užklausą, IP adresas |
AUTH_TYPE | Autentifikacijos metodas, naudojamas vartotojui patvirtinti (paskelbti galiojančiu) |
REMOTE_USER | Autentiškas vartotojo vardas |
CONTENT_TYPE | Užklausos duomenų turinio tipas (pvz. text/html) |
CONTENT_LENGTH | Duomenų, kuriuos gavo CGI programa iš standartinio įvedimo įrenginio, tipas |
HTTP_FROM | Vartotojo, atlikusio užklausą, e-mail'as |
HTTP_ACCEPT | Duomenų tipų, kuriuos gali priimti klientas, sąrašas |
HTTP_USER_AGENT | Kliento programinė įranga, naudojama užklausai atlikti |
HTTP_REFERER | Dokumento, į kurį klientas kreipiasi prieš pasiekiant CGI programą, URL adresas. |
Pradėkime nuo paprastos programos, kuri parodo įvairią informaciją apie serverį, jo programinę įrangą, bei naudojamų CGI ir HTTP peržiūrą.
Panagrinėkime šį pavyzdį pažingsniui. Labai svarbi pirmoji eilutė. Joje nurodoma, kur serveris gali rasti Perl'o interpretatorių, tam kad galėtų įvykdyti CGI programą.
Kai programa jau vykdoma, pirmiausia, ką reikia padaryti, tai sugeneruoti teisingą HTTP antraštę, kuri baigiasi tuščia eilute. Šią antraštę paprastai sudaro turinio tipas (dar žinomas kaip MIME tipas). Šiuo atveju toliau esančių duomenų tipas "text/html".
Toliau mes galime išvesti informaciją HTML formatu. Mes siunčiame informaciją tiesiogiai į standartinį išvedimo įrenginį, kuri nuskaitoma ir apdorojama serverio, o paskui siunčiama klientui atvaizdavimui. Šiame pavyzdyje panaudoti penki aplinkos kintamieji, kurie Perl'e gaunami iš masyvo %ENV.
2.1.2. Priėjimo apribojimai skirtingoms sritims (domenams)
Jeigu jūs nenorite, kad visi prieitų prie tam tikros informacijos, skirtos vietiniam naudojimui, jūs galite sukonfigūruoti savo serverį taip, kad priėjimas prie tos informacijos būtų apribotas, priklausomai nuo tos srities (domeno), iš kurios vartotojas jungiasi prie interneto. Čia vartotojams, prisijungusiems iš skirtingų sričių, pateikiami skirtingi dokumentai. Peržiūrėkime CGI programą, kuri atlieka pseudo autentifikaciją.
Programoje panaudoti du aplinkos kintamieji:
$remote_address = $ENV('REMOTE_ADDR'); $remote_host = $ENV('REMOTE_HOST');
'REMOTE_ADDR' gražina nutolusio vartotojo IP adresą skaitmeniniame pavidale, o 'REMOTE_HOST' - simbolių pavidale. Kartais 'REMOTE_HOST' negražina vardo (kai DNS serveris neturi įrašo apie domeną). Tada galima panaudoti tokį kodą, paverčiant IP adresą atitinkamu vardu:
@subnet_numbers = split (/\./, $remote_address); $packed_address = pack ("C4", @subnet_numbers); ($remote_host) = gethostbyaddr ($packed_address, 2);
Toliau tikrinama, ar 'REMOTE_HOST' pabaiga sutampa su užduotu kintamuoju $host_address ir 'REMOTE_ADDR' pradžia - su $ip_address. Priklausomai nuo rezultato, pateikiami skirtingi dokumentai: "internal.htm" - vietiniam naudojimui arba "general.htm" - bendram naudojimui.
2.1.3. Vartotojų autentifikacija ir indentifikacija
Papildomai prie anksčiau nagrinėtos informacijos apsaugos priemonės, daugelis HTTP serverių palaiko apsaugą, vadinamą vartotojo autentifikacija. Naudojant šį metodą, vartotojui kreipiantis tam tikru adresu, jis užklausiamas vardo ir slaptažodžio. Vartotojo vardas perduodamas panaudojant 'REMOTE_USER' kintamąjį. Vartotojo indentifikacija gali būti atliekama tikrinant šio kintamojo turinį su norima reikšme.
Štai trumpa programos ištrauka, iliustruojanti 'REMOTE_USER' kintamojo panaudojimą:
$remote_user = $ENV('REMOTE_USER'); if ($remote_user eq "jon") { print "Sveikas Joni, kaip sekasi biznis?","\n"; } elseif ($remote_user eq "bob") { print "Labas Bobai, kaip tavo sveikata? Girdėjau, buvai susirgęs.", "\n"; }
Autentifikacija neužtikrina pilno saugumo, nes siunčiant neužkoduotus slaptažodį ir vardą serveriui, jie gali būti iššniukštinėti, todėl nepatartina autentifikacijai naudoti tikrus vardą ir slaptažodį.
2.2. Įvedimas naudojant formas
Plačiau apie formas kalbėsime 4 skyriuje "Formos ir CGI", tačiau dabar aptarsime pagrindinius principus.
Formos leidžia gauti duomenis iš vartotojų ir perduoti juos CGI programai. Web peržiūros priemonės leidžia vartotojui pažymėti arba įvesti informaciją, ir tada persiunčia ją serveriui, kai nuspaudžiamas patvirtinimo mygtukas. Toliau panagrinėsime, kaip CGI programos prieina prie formų duomenų.
2.2.1. Užklausų eilutės
Vienas iš būdų persiųsti duomenis CGI programai, yra informacijos prijungimas prie URL. Pridėtinė informacija nuo adreso atskiriama klaustuku. Pavyzdžiui:
http://www.soften.ktu.lt/cw/~virga/pvz23.pl?finger
Visa informacija po "?" ženklu yra vadinama užklausos eilute. Kai serveris gauna URL su užklausos eilute, viską, kas yra po "?", yra priskiriama aplinkos kintamajam QUERY_STRING. Priklausomai nuo šio kintamojo informacjos, programa gali atlikti skirtingus veiksmus.
Pavyzdys 2.3:
Programą galima kviesti arba:
arba
Vykdant bet kokias sistemines komandas CGI programose reikia būti labai atsargiais, nes atsiranda saugumo problemų. Niekada negalima atlikti tokios komandos:
print '$query_string';
Pavojus tame, kad koks nors vartotojas gali įvesti komanda, kuri sunaikins reikalingus duomenis jūsų diske.Pvz.:
rm -fr /
Nors prieš tai esantis pavyzdys ir veikia, sekantis pavyzdys yra labiau realistinis iliustruojant kaip formos dirba su CGI. Vietoj tiesioginio informacijos prijungimo prie URL, duomenų gavimui iš vartotojo mes naudosime formą.
Šią formą sudaro vienas tekstinis laukas "Command:", bei du mygtukai: "Submit Form" ir "Clear Form". Nuspaudus "Submit Form" mygtuką, formos informacija siunčiama CGI programai, nurodytai atributu "ACTION". "Clear Form" mygtukas reikalingas formos informacijos išvalymui.
Atributas "METHOD=GET" parodo, kaip duomenys patenka į serverį. Apie skirtingus metodus pakalbėsime sekančiame skyrelyje, o dabar panagrinėsime metodą, naudojamą pagal nutylėjimą, GET. Tarkime, kad vartotojas tekstiniam lauke įvedė "finger" ir nuspaudė "Submit Form" mygtuką. Tokiu atveju serveris gauna tokią informaciją:
GET http://www.soften.ktu.lt/cw/~virga/pvz24.pl?command =finger HTTP/1.0 . . (antraštės informacija) .
Serveris vykdo programą unix_get.pl ir informaciją, esančią po "?" simboliu - "command=finger", patalpina į aplinkos kintamąjį QUERY_STRING. Manoma, kad kintamajam "command" priskiriama vartotojo įvesta informacija "finger".
Vartotojo įvestai informacijai atskirti naudojame komandą split:
$query_string = $ENV('QUERY_STRING'); ($field_name, $command) = split (/=/, $query_string);
Toliau, priklausomai nuo įvestos informacijos, atliekame skirtingus veiksmus.
Jei naudojamas GET metodas, visa formos informacija yra prijungiama prie URL. Todėl mes galime vykdyti programą tiesiogiai, nenaudodami formos. Tam suformuojame tokį URL:
http://www.soften.ktu.lt/cw/~virga/pvz24.pl?command =finger
2.2.3. GET ir POST metodai
Praeitame pavyzdyje duomenims iš formos į serverį perduoti buvo naudojamas GET metodas. Dar galima naudoti POST metodą. Naudojant POST metodą, serveris perduoda duomenis programai kaip įvedimo srautą. Jeigu praeitame pavyzdyje <FORM> dalį pakeistume taip:
<FORM ACTION="unix_pos.pl" METHOD="POST">
Serveris gautų tokią informaciją:
POST http://www.soften.ktu.lt/cw/~virga/unix_pos.pl . . (antraštės informacija) . Content-length: 14 command = finger
Po to, kai serveris perduoda informaciją programai kaip duomenų srautą, jis nustato aplinkos kintamąjį CONTENT_LENGHT lygų perduotos informacijos bitų (arba simbolių) skaičiui. Pasinaudodami šiuo kintamuoju, mes galime nuskaityti reikiamą duomenų kiekį iš standartinio įvedimo įrenginio:
$size_of_form_information = $ENV('CONTENT_LENGTH'); read (STDIN, $form_info, $size_of_form_information);
Daugiau šie du pavyzdžiai niekuo nesiskiria.
Norint padaryti universalią programą - tinkamą naudoti abiem metodais: GET ir POST, galima pasinaudoti aplinkos kintamuoju REQUEST_METHOD:
$request_method = $ENV('REQUEST_METHOD); if ($request_method eq "GET") { $form_info = $ENV('QUERY_STRING'); } else { $size_of_form_information = $ENV('CONTENT_LENGTH'); read (STDIN, $form_info, $size_of_form_information); }
Kol kas mes iš formų gaudavome lagai paprastą informaciją, tačiau ji gali būti žymiai sudėtingesnė. Pavyzdžiui, naudojant GET metodą, informacija perduodama, kaip URL dalis, todėl joje negali būti tarpo ar kitų specialių simbolių, kurie negalimi URL. Dėl to naudojamas specialus kodavimas. Panagrinėkime trumpą pavyzdį, kad suprastume, kaip tai vyksta.
Kai vartotojas patvirtina formą, klientas perduoda serveriui tokį pareikalavimą (tarkime, vartotojas įvedė 11/05/73 ):
POST http://www.soften.ktu.lt/cw/~virga/birthday.pl . . (antraštės informacija) . Content-length: 21 birthday=11$2F05%2F73
Užkoduotuose duomenyse tarp bei kiti specialūs simboliai pakeičiami jų šešioliktainiais ekvivalentais. Šiame pavyzdyje mums reikia atkoduoti informaciją, paverčiant "%2F" į "/". Tam atliekame tokią komandą:
$form_info =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack ("C", hex ($1))/eg;
Plačiau dekodavimo procesas bus panagrinėtas 4 skyriuje 'Formos ir CGI'.
Be užklausos CGI programai, naudodami URL mes galime perduoti informaciją, vadinamą pridėtine kelio informacija. Šis metodas grindžiamas tuo, kad serveris žino, kur baigiasi programos vardas. Visa informacija, sekanti po programos vardo, vadinama pridėtine. Štai pridėtinės kelio informacijos perdavimo ir panaudojimo pavyzdys:
Pavyzdys 2.6
Serveris žino, kad 'display.pl' yra programos pavadinimas ir informacija, esanti po šio pavadinimo, patalpinama aplinkos kintamajame PATH_INFO. Taip pat nustatomas kintamasis PATH_TRANSLATED, kuris apjungia DOCUMENT_ROOT ir PATH_INFO.