2. Duomenų įvedimas į CGI

  1. Aplinkos kintamieji
  2. Įvedimas naudojant formas
  3. Pridėtinė kelio informacija
  4. Savikontrolės klausimai

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.

2.1.1. Apie serverį

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

ATSARGIAI

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 /

2.2.2. Paprastos formos

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);
}

2.2.4. Užkoduoti duomenys

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

3. Pridėtinė kelio informacija

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.

Pavyzdys, parodantis dažniausiai vartojamus aplinkos kintamuosius:

2.4. Savikontrolės klausimai

  1. Kokiu būdu CGI programa gauna duomenis?
  2. Kokius žinote duomenų perdavimo iš formos serveriui metodus? Kuo jie skiriasi?
  3. Kam naudojamas duomenų kodavimas ir kaip jis atliekamas?

Atsakymai