CATEGORII DOCUMENTE |
Client-server si CGI
CGI este un standard pentru interactiunea clientilor cu programe de interfata de uz general (external gateway) cu Web-ul (documente HTML), adica cu serveri HTTP. Versiunea CGI este 1.1 sau CGI/1.1. Un program CGI, numit script, se executa pe acelasi sistem cu serverul de Web. El preia informatia trimisa de browser serverului (coordonatele unei zone senzitive sau intrarea de la un form), proceseaza informatia si trimite raspunsul browserului. Aceasta deoarece un document HTML accesat de un browser este static. El nu va putea sa-si schimbe continutul sau sa permita prelucrari. Pe de alta parte, un script CGI ii confera unui document HTML un caracter dinamic, de timp real. De exemplu, se doreste introducerea unei baze de date Unix in WWW, pentru a permite interogarea ei de alti utilizatori. Pentru aceasta se creaza un program CGI ce va fi executat de daemonul Web la accesarea unei pagini Web. Scriptul va transmite informatie catre database engine, va primi rezultatele si le va transmite clientului, fiind afisate de browserul sau. Este un exemplu de program de gateway (interfata), de la care isi trage originea CGI 1.1. Trebuie ca scriptul sa nu execute o actiune prea lunga pentru a nu plictisi clientul asteptand rezultatul, altfel poate fi executat orice.
Deoarece in acest mod se permite executarea unui program de catre oricine, exista probleme de securitate ce trebuie rezolvate. Pentru versiunea de server HTTPd NCSA trebuie asigurat si un director special ../cgi-bin. Scriptul poate fi scris in oricare din limbaje
C/C++
Fortran
Perl
Tcl
orice shell Unix
Daca se foloseste un compilator trebuie mai intai adus programul la forma executabila. Daca programul este un script pur in Perl, Tcl, sau shell Unix, el are nevoie doar sa se afle in directorul ../cgi-bin. Scripturile pure sunt si mai usor de depanat, modificat.
Orice program este un program CGI daca respecta doua reguli :
programul scrie la iesirea standard.
programul contine headere care permit serverului sa interpreteze
iesirea scriptului
Cele mai multe din scripturile CGI sunt create pentru procesarea unor formulare de intrare numite form-uri. Orice form care este generat pentru Web contine doua parti :
codul HTML pentru form, care permite afisarea continutului sau de catre browser
scriptul CGI, ce se executa pe server, care proceseaza continutul formului
Adaugarea unui script CGI la un form HTML
Componentele CGI si HTML sunt legate de atributul ACTION din tagul <FORM>. Se da astfel numele scriptului CGI pentru prelucrare. Exemplu :
<FORM ACTION=' /cgi-bin/formscript'>
Form-urile permit trimiterea datelor introduse in doua feluri, cu GET si POST. Specificarea modului se face cu atributul METHOD din tagul <FORM>, exemplu :
<FORM METHOD=POST ACTION=' /cgi-bin/formscript'>
GET preia datele si le apendeaza la sfarsitul URL-ului specificat in ACTION, din tagul <FORM>. Daca se doreste intoducerea numelui si a varstei unei persoane, URL-ul va fi .
https://host/cgi-bin/formscript?name=username&age=25
Serverul va prelua informatia de dupa ? din URL in variabila de mediu QUERY_STRING.
POST trimite data separat de apelul scriptului. POST este cel mai bine de folosit daca datele introduse sunt numeroase, deoarece datele sunt introduse intr-o lista in stdin (fara EOF), fara a fi asignate unei variabile. Lungimea sirului de caractere de citit din stdin se afla din variabila CONTENT_LENGTH. De fiecare data cand clientul acceseaza URL-ul corespunzator programului CGI, serverul il va executa in timp real. Iesirea poate fi directionata total sau partial catre client. Nu se pot transmite optiuni de comenzi sau argumente unor programe CGI, de tipul
command% myprog -qa on
Un CGI poate prelua insa, prin variabile de mediu, diversi parametri. Principalele
variabile de mediu folosite sunt :
QUERY_STRING - stringul de dupa ? din URL (cu GET din document HTML, din document ISINDEX, adaugat manual intr-o ancora HTML ce refera gateway-ul. Continutul este o cerere codata conform standardului URL, spatiile sunt inlocuite de + iar anumite caractere speciale de forma lor hexazecimala cu %HH. Inainte de a fi folosita, cererea trebuie decodata.
PATH_INFO - informatia de cale absoluta (PATH_TRANSLATED pentru relativa) unde se afla fitiere asupra carora actioneaza scriptul.
Cand serverul Web proceseaza o cerere de incarcare a unui fisier, daca el este in directorul ../cgi-bin (cale relativ) si exista drept de executie, scriptul va fi executat pe server. Pentru ca autorul scriptului sa se asigure ca scriptul sau va putea fi executat trebuie sa introduca
chmod 755 formscript
ltfel va fi raportatao eroare. Scriptul va returna rezultatul format in HTML sau o imagine. In timpul executiei, un script poate accesa variabile de mediu. Prima linie returnata trebuie sa fie :
Tip retur Text
Pagina HTML Content-type: text/html
Imagine gif Content-type: image/gif
De altfel, tipul rezultatului poate fi foarte diferit : imagine, HTML, cum am mai spus, dar si clip audio de exemplu, referire la alt document, etc. Clientul trebuie sa stie tipul rezultatului, deci CGI va spune serverului aceasta. Dupa cum am aratat, trebuie plasat un mic header in document, ASCII, specificand aceasta, despartit de cateva linii de continutul propriu-zis.
raspuns de tip MIME - tipurile MIME sunt text/html pentru documente HTML si text/plain pentru texte ASCII simple. De exemplu,
Content-type: text/html
<HTML><HEAD>
<TITLE>raspuns HTML din script CGI</TITLE>
</HEAD><BODY>
<H1>Afisarea raspunsului</H1>
Ce parere aveti de <STRONG>aceasta?</STRONG>
</BODY></HTML>
referinta la alt document - se poate ca raspunsul sa conste din afisarea unui alt document. De exemplu, referirea unui fisier de pe un server Gopher, caz in care trebuie stiut URL-ul fisierului
Content-type: text/html
Location: gopher://httprules.myfoo.org/0
<HTML><HEAD>
<TITLE>Sorrys-a mutat</TITLE>
</HEAD><BODY>
<H1>Cauta cu gopher !</H1>
Disponibil acum la
<A HREF='gopher://httprules.myfoo.org/0'>noua locatie</A>
pe serverul gopher.
</BODY></HTML>
Pentru a fi siguri ca scriptul se va executa trebuie sa ne asiguram de :
este executabil
se afla in directorul cgi-bin stabilit de webmaster
poate accesa orice fisier de care are nevoie. Trebuie avut in vedere ca path-urile vor fi relative la directorul cgi-bin in care se executa scriptul (la accesarea unor legaturi hipertext este bine sa se folosesca forma completa de URL)
pe un server Unix este bine sa se seteze bitul suid pentru a avea acces la resursele la care avea acces proprietarul fisierului. Desigur, acest lucru insemna o pierdere de securitate
La scrierea unui form fiecare item de intrare are un tag NAME. Cand se introduc date in elementele din form informatia este codata. Formul este un sir de perechi codate name=value separate prin &. Sirul de caractere trebuie parsat dupa & iar perechile decodate si valorile folosite. Aceasta se face cu :
shell Bourne : AA archie gateway. Contine apeluri sed si awk ce convertesc un string form cu GET in variabile de mediu
C: scripturi pentru httpd NCSA.
Perl: Perl cgi-lib. Package-ul contine rutine pentru gestiunea formurilor in scripturi CGI, crearea lor, parsarea cererilor CGI, etc
Tcl: procesor Tcl (Translate Commnad Language). Rutine pentru decodificarea formurilor si plasarea valorilor in variabile TCL
Securitate cu scripturi CGI
Ori de cate ori un program interactioneaza cu un client din retea, exista posibilitatea pentru client de a obtine acces neautorizat prin aceasta actiune. Pentru a inlatura pe cat posibil acest lucru trebuie avut in vedere :
instructiunea eval
Limbaje ca Perl sau shell Bourne permit comanda eval ce determina construirea unui sir si face ca interpreterul sa execute sirul. De exemplu :
eval `echo $QUERY_STRING | awk 'BEGIN ' `
Exemplul preia o cerere si o converteste in set variabil de comenzi. El poate fi atacat prin trimiterea unei cereri ce incepe cu a ;.
clientul poate ataca prin caractere speciale neautorizate sau neinterpretabile de shellul Bourne, creandu-si acces neautorizat.
functiile popen si system - trebuie plasat inaintea oricarui caracter cu semnificatie speciala pentru sh. Se rezolva cu un program C.
Exemple de CGI
Cel mai simplu program este unul de tip Hello World care se scrie in C
#include < stdio.h>
main()
Compilat, programul va scrie la executie 'Hello World!' la outputul standard. Pentru a-l putea accesa cu un browser Web trebuie sa facem mici modificari programului. Cand un browser intilneste un program CGI, ca cel prezentat, il executa si trimite iesirea viewerului sau. Deci, pentru ca ceea ce va fi afisat sa poata fi inteles de viewer, trebuie sa fie ca un document HTML (trebuie sa contina taguri). Vom atasa programului initial doua printf-uri continand <HTML> si </HTML>. Astfel, rezultatutul afisarii devine un text intr-un document HTML. Mai trebuie facut inca un lucru : tipul documentului trebuie identificat pentru browser. Vom adauga un alt printf cu textul 'Content-Type: text/html', urmat de doua newline-uri. In final programul C cu afisare in document HTML arata :
#include < stdio.h>
main()
Un alt program simplu de echo genereaza un form simplu si afiseaza ce s-a introdus. De obicei, se scrie un program pentru form si unul pentru a parsa informatia introdusa. De asemenea, se pot combina cele doua programe. Programul echo va fi executat de doua ori, odata pentru generarea form-ului si apoi pentru afisarea continutului in document HTML. Pentru ca programul sa 'stie' in care mod este, generare form sau afisare, o cerere pentru form nu va transmite orice date catre program iar o alta cerere pentru calcul va transmite (acest lucru il rezolva libraria CGI). Programul contine un if pentru cele doua moduri de lucru : daca nu preia date de intrare se genereaza un form HTML iar daca exista date de intrare se fac prelucrari si rezultatul este afisat prin intermediul unui document HTML.
main()
else /* nu exista intrare, deci genereaza form */
}
Nu s-au prezentat detalii legate de preluarea intrarii, care este specific librariei si limbajului (LibCGI, EIT). S-au dublat ' pentru a introduce string-uri in printf.
Ultimul exemplu este un program de inmultire. Programul este format din doua parti, una care genereaza un form si alta care face un calcul si afiseaza rezultatul cu un document HTML. Exemplul este similar celui precedent, cu exceptia valorii round folosita pentru a controla iesirea (flag) si a convertirii intrarii alfanumerice in numeric.
main()
else
}
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1416
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved