Realizarea de scripturi CGI

38
Programare Programare Perl Perl Sabin Sabin - - Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busaco www.infoiasi.ro/~busaco / / 1 1 Programare Programare Perl Perl Realizarea Realizarea de de scripturi scripturi CGI CGI Sabin-Corneliu Buraga Facultatea de Informatica, UAIC, Romania http://www.infoiasi.ro/~busaco/

Transcript of Realizarea de scripturi CGI

Page 1: 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/

Page 2: Realizarea de scripturi CGI

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

Page 3: Realizarea de scripturi CGI

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

Page 4: Realizarea de scripturi 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

Page 5: Realizarea de scripturi CGI

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

Page 6: Realizarea de scripturi CGI

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

Page 7: Realizarea de scripturi CGI

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

Page 8: Realizarea de scripturi CGI

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

Page 9: Realizarea de scripturi CGI

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

Page 10: Realizarea de scripturi CGI

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

Page 11: Realizarea de scripturi CGI

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

Page 12: Realizarea de scripturi CGI

ProgramareProgramare PerlPerl

SabinSabin--Corneliu Buraga Corneliu Buraga www.infoiasi.ro/~busacowww.infoiasi.ro/~busaco// 1212

URL special (cazul GET)

CGI | invocare/3CGI | invocare/3

Page 13: Realizarea de scripturi CGI

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

Page 14: Realizarea de scripturi CGI

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

Page 15: Realizarea de scripturi CGI

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

Page 16: Realizarea de scripturi CGI

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

Page 17: Realizarea de scripturi CGI

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

Page 18: Realizarea de scripturi CGI

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

Page 19: Realizarea de scripturi CGI

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

Page 20: Realizarea de scripturi CGI

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

Page 21: Realizarea de scripturi CGI

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

Page 22: Realizarea de scripturi CGI

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

Page 23: Realizarea de scripturi CGI

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

Page 24: Realizarea de scripturi CGI

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

Page 25: Realizarea de scripturi CGI

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

Page 26: Realizarea de scripturi CGI

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

Page 27: Realizarea de scripturi CGI

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

Page 28: Realizarea de scripturi CGI

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

Page 29: Realizarea de scripturi CGI

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

Page 30: Realizarea de scripturi CGI

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

Page 31: Realizarea de scripturi CGI

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

Page 32: Realizarea de scripturi CGI

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

Page 33: Realizarea de scripturi CGI

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 &lt; &gt; &amp; in loc de < > &)

– unescapeHTML() – decodifica un sir codificatcu escapeHTML()

ModululModulul CGICGI

Page 34: Realizarea de scripturi CGI

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

Page 35: Realizarea de scripturi CGI

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

Page 36: Realizarea de scripturi CGI

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

Page 37: Realizarea de scripturi CGI

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

Page 38: Realizarea de scripturi CGI

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