Realizarea de scripturi CGI
Transcript of Realizarea de scripturi CGI
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 11
ProgramareProgramare PerlPerlRealizareaRealizarea de de scripturiscripturi CGICGI
Sabin-Corneliu BuragaFacultatea de Informatica, UAIC, Romania
http://www.infoiasi.ro/~busaco/
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 22
“Miracles happen to those who believe in them.”
Bernard Berenson
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 33
CuprinsCuprins
• Scripturi CGI (Common Gateway Interface)
• SSI (Server Side Includes)• Programare Web in Perl
via modulul CGI
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 44
CuprinsCuprins
• Scripturi CGI (Common Gateway Interface)–Caracterizare–Variabile de mediu–Invocare–GET versus POST
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 55
• Standard de facto pentru interactiuneaprogramatica a clientilor cu serverele Web: CGI/1.1
• Scop: generarea dinamica pe server de reprezentari ale unor resurse solicitatede un client Web– HTML, text obisnuit, imagini JPEG etc.
• Un program (script) CGI se invoca pe server, in mod implicit sau explicit (i.e. preluarea informatiilor dintr-un formular)
CGI | CGI | caracterizarecaracterizare
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 66
• Scripturile CGI pot fi conceputein orice limbaj disponibil pe server–Limbaje interpretate: bash, Perl (modulul CGI), Python, Pike,...
–Limbaje compilate: C, C++,...
CGI | CGI | caracterizarecaracterizare
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 77
• Un script CGI scrie datelela iesirea standard (stdout)
• Un script CGI genereaza/foloseste anteturiHTTP, utilizind standardul MIME – exemplu: Content-type: text/html
• Unui program CGI, datele de procesati se vor trimite la intrarea standard sauprin intermediul unor variabile de mediu
• Detalii: http://hoohoo.ncsa.uiuc.edu/cgi
CGI | CGI | programeprograme
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 88
• Un program CGI are accesla variabilele de mediu:–Independente de metoda cererii:
SERVER_NAME, GATEWAY_INTERFACE–Specifice cererilor transmise spre script:
SERVER_PROTOCOL, REQUEST_METHOD,QUERY_STRING, REMOTE_HOST,REMOTE_ADDR, CONTENT_TYPE,CONTENT_LENGTH
CGI | variabile/1CGI | variabile/1
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 99
• Variabile suplimentare:HTTP_ACCEPT, HTTP_USER_AGENT,...
• Exemplu de script CGI care afiseazavariabilele de mediu:
#!/usr/bin/perl# Afiseaza mediulprint "Content-type: text/plain\n\n"; print "Environment:\n\n"; foreach $key (keys %ENV) {
printf "%16s = %s\n", $key, $ENV{$key}; }
variabile.cgi
cu drepturi de citire si executie
CGI | variabile/2CGI | variabile/2
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 1010
#!/usr/bin/perl
print “Content-type: text/html”printprint “<p>Salut din CGI!</p>”
• Invocare directa (prin GET):http://domeniu/~utilizator/salut.cgi
salut.cgi
stocat in ~/html/
CGI | invocare/1CGI | invocare/1
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 1111
<form action=“http://www.infoiasi.ro/cgi-bin/max.cgi“method=“GET”>
<p>Va rugam, introduceti doua numere:<input name="nr1" size="5“ /> <input name="nr2" size="5“ /> </p><p> <input type="submit" value="Afla maximul" /> </p>
</form>
• Invocare dintr-un formular interactiv(GET sau POST)
CGI | invocare/2CGI | invocare/2
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 1212
URL special (cazul GET)
CGI | invocare/3CGI | invocare/3
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 1313
• Pentru fiecare cimp al formularului, se genereaza o pereche nume_cimp=valoaredelimitata de & care va fi adaugata URL-uluiunde este stocat programul CGI:http://www.infoiasi.ro/cgi-bin/max.cgi?nr1=7&nr2=4
• Acest URL este codificat(%hexa, spatiul devine +) – URL encoding
• Serverul va invoca scriptul CGI pasindu-i datele la intrarea standard sau via variabile de mediu
CGI | invocare/4CGI | invocare/4
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 1414
• Procesarea datelor prin metoda GET– Datele vor fi disponibile in variabila
QUERY_STRING
• Procesarea datelor prin metoda POST– Datele vor fi accesate de la intrarea standard
(stdin), lungimea in octeti a datelor primitefiind stocata in variabila CONTENT_LENGTH
CGI | invocare/5CGI | invocare/5
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 1515
• Procesul de invocare a scripturilor CGI
CGI | invocare/6CGI | invocare/6
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 1616
# preluam sirul de interogare# din variabila de mediu QUERY_STRING$interogare = $ENV{'QUERY_STRING'} ||
die "Sir de interogare vid!\n";%parametri = &analiza_parametri ($interogare);# preluam valorile parametrilor$nr1 = $parametri{'nr1'};$nr2 = $parametri{'nr2'};$max = ($nr1 > $nr2) ? $nr1 : $nr2;print "<p>Maximul dintre $nr1 si $nr2 este: $max</p>\n";
CGI | GETCGI | GET
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 1717
sub analiza_parametri {local ($interogare) = @_; local (@perechi) = split('&', $interogare); # perechi 'camp=valoare'local ($parametru, $valoare, %parametri); foreach (@perechi) {
($parametru, $valoare) = split('='); # valoarea & numele de camp$parametru = &unescape($parametru); # decodificam valorile$value = &unescape ($value); if ($parametri{$parametru}) { # memoram in tabloul 'parametri'
$parametri{$parametru} .= "$;$valoare"; } else { $parametri{$parametru} = $valoare; }
} # final de foreachreturn %parametri;}
CGI | GETCGI | GET
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 1818
sub unescape { # functie de decodificarelocal ($sir) = @_; $sir =~ tr/+/ /; # "+" devine spatiu# %HH devine caracter ASCII $sir =~ s/%([0-9A-Fa-f]{2})/pack("c", hex($1))/ge; return $sir;}
CGI | GETCGI | GET
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 1919
• In cazul folosirii metodei POST, preluam parametrii de interogarede la intrarea standard (STDIN):
read(STDIN, $interogare, $ENV{'CONTENT_LENGTH'});
• Restul programului CGI este similar celui precedent
CGI | POSTCGI | POST
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 2020
• Metoda GET se foloseste pentru generarea de reprezentari ale resurselor cerute(starea serverului nu trebuie sa se modifice)
• Metoda POST se utilizeaza atunci cind dateletransmise serverului au dimensiuni mari (continutde fisiere) sau sint “delicate” (e.g., parole); de asemenea, cind invocarea scriptuluipoate conduce la modificari ale starii pe server (adaugarea unei inregistrari, alterarea unui fisier,...)
• Folosind GET, se poate stabili un bookmarkpentru acces ulterior la o resursa Web
CGI | GET vs. POSTCGI | GET vs. POST
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 2121
•Ofera posibilitatea executiei scripturilorCGI si a altor actiuni, direct dintr-un document Web•Comenzi (directive) SSI:
<!--#directiva -->•Fisierele continind directive SSI
au extensia .shtml
Server Side IncludesServer Side Includes
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 2222
•Comenzi uzuale:–echo – afiseaza valoarea anumitor variabile
<p>Data si timpul: <!--#echo var="DATE_LOCAL"--></p>
<p>Legătura prin care s-a ajuns aici este <!--#echo var="HTTP_REFERER" --></p><p>Numele acestui document este <!--#echo var="DOCUMENT_NAME" --></p>
Server Side IncludesServer Side Includes
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 2323
• Comenzi uzuale:– echo – afiseaza
valoarea anumitorvariabile
Server Side IncludesServer Side Includes
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 2424
•Comenzi uzuale:–flastmod – furnizeaza data ultimei
modificari a unui fisier<p>Ultima modificare:
<!--#flastmod file=“web.html”--></p>–fsize – furnizeaza marimea unui fisier
<!--#fsize file="index.html" -->
Server Side IncludesServer Side Includes
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 2525
•Comenzi uzuale:–exec – executa un script CGI
(nu este permisa pentru IIS)<!--#exec cgi=“citat.pl.cgi” -->
–include – include un fisier<!--#include file=“antet.html.inc” -->
• Atentie la probleme de securitate ce pot aparea!
Server Side IncludesServer Side Includes
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 2626
CuprinsCuprins
• Programare Web in Perl via modulul CGI–Prezentare generala–Preluarea parametrilor–Redirectarea clientului–Alte metode utile–Exemple
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 2727
• Ofera rutine/metode pentru dezvoltarea comodaa scripturilor CGI
• Generare de cod HTML – maniera procedurala#!/usr/bin/perl
use CGI qw/:standard/; # utilizare CGI standard
print header(); # trimitem antetul HTTP# afisam antetul paginii Webprint start_html(-title => "Un salut");print h1('Salut!'),
p('Un paragraf...'); # diferite elemente HTML# afisam finalul de documentprint end_html();
ModululModulul CGICGI
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 2828
• Generare de cod HTML – maniera obiectuala
#!/usr/bin/perl
use CGI; # utilizam modulul CGI
$c = new CGI; # instantiem obiectul CGIprint $c->header(); # trimitem antetul HTTP# afisam antetul paginii Webprint $c->start_html(-title => "Un salut");print $c->h1('Salut!'),
$c->p('Un paragraf...'); # diferite tag-uri HTML# afisam finalul de documentprint $c->end_html();
ModululModulul CGICGI
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 2929
• Preluarea parametrilor transmisi scriptului– Se foloseste param()@parametri = $c->param(); # lista parametrilor disponibiliprint “@parametri”;$nume = $c->param('nume'); if ($nume != 'Admin') {print '<p>Nume incorect...</p>';
}
ModululModulul CGICGI
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 3030
• Redirectarea clientului
# redirectare in functie de limbaif ($limba eq 'ro')
print $c->redirect('/index.ro');else
print $c->redirect('/index.en');
ModululModulul CGICGI
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 3131
• Trimiterea antetului HTTP
# trimite Content-type: image/gifprint $c->header('image/gif');
ModululModulul CGICGI
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 3232
• Alte metode: – query_string() – sirul de interogare pt. GET– remote_addr() – adresa IP a masinii-client– remote_host() – adresa simbolica/domeniul
clientului– request_method() – cererea HTTP realizata– user_agent() – informatii privitoare
la programul-client (browser-ului)– cookie() – acces la cookie-uri
ModululModulul CGICGI
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 3333
• Alte functii utile: – escape() – genereaza un sir codificat in stilul URI
(caracterele speciale sunt substituite de %NN)– unescape() – decodifica un sir codificat
cu functia escape() – escapeHTML() – genereaza un sir codificat in stilul
HTML (caracterele speciale sunt inlocuitecu entitatile < > & in loc de < > &)
– unescapeHTML() – decodifica un sir codificatcu escapeHTML()
ModululModulul CGICGI
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 3434
• Afişarea unei imagini aleatoare#!/usr/bin/perl# afiseaza continutul unui fisier grafic ales aleatoriuuse CGI qw/:standard/;# constante folosite pentru specificarea# directoarelor care contin imagini$DIR_RADACINA = '.';$DIR_IMAGINI = 'img';chdir "$DIR_RADACINA/$DIR_IMAGINI" or die "directorul de imagini e inaccesibil.";
# preluam intr-un tablou fisierele JPEG, GIF si PNG@imagini = <*.{jpg,gif,png}>;
ModululModulul CGI | CGI | exempluexemplu
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 3535
• Afişarea unei imagini aleatoare (cont.)
# alegem imaginea$imagine = $imagini [rand (@imagini)];die "eroare la selectarea imaginii"
unless $imagine;# redirectam navigatorul spre imaginea aleasa print redirect ("$DIR_IMAGINI/$imagine");
ModululModulul CGI | CGI | exempluexemplu
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 3636
• Pentru procesarea continutului HTML: modulul HTML::Parser
• Pentru preluarea continutului resurselor Web: modulul LWP (Library for Web access in Perl)
• Pentru redirectarea mesajelor de eroarespre un fisier de jurnalizare ori spre browser: modulul CGI::Carpuse CGI::Carp qw(fatalsToBrowser);die "O eroare intentionata...";
AlteAlte module utilemodule utile
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 3737
PerlPerl• Exercitii
– Sa se scrie un script CGI care sa afiseze un citat celebru ales aleatoriu dintr-o lista, in functie de localizarea geografica a vizitatorilor
– Sa se conceapa o aplicatie Web care sa oferevizitatorilor posibilitatea de a-si partaja si organizacolectiile multimedia personale (stocate peCD/DVD-uri); se vor putea realiza si cautariconform unor criterii (simple sau multiple) furnizate de utilizator, eventual recurgindu-se la expresii regulate
ProgramareProgramare PerlPerl
SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 3838
RezumatRezumat
• Scripturi CGI (Common Gateway Interface)
• SSI (Server Side Includes)• Programare Web in Perl
via modulul CGI