Formulare HTML – setarea de sesiuni si cookies in PHP

0

In acest tutorial va prezentam cateva informatii despre Formulare HTML, Persistenta Datelor, cum setam sesiuni si cookies in PHP, cum uploadam fisiere si serializam obiecte in PHP.

Formularele sunt utile pentru a realiza schimburi de informatii cu serverul, mai precis, pentru a trimite informatii server-ului.

Un exemplu de formular:

Formularul de mai sus va fi trimis resursei script.php, folosind metoda POST.

Acesta contine un editbox avand numele camp_text si valoarea default “completeaza aici”, valoare ce poate fi modificata de utilizator.

In continuare, formularul contine un camp de tip parola (are caracterele ascunse), apoi o camp richtext;

Acelasi formular contine si un selectbox, avand lista de optiuni posibile, precum si o optiune selectata default.
Gasim de asemenea si o lista de “radio buttons”. Particularitatea la radio buttons este ca toate optiunile au acelasi nume. Va fi trimisa script-ului doar valoarea bifata.

Metodele GET si POST

In HTML, putem specifica doua metode diferite de trimitere a formularului (folosind proprietatea METHOD).

Daca metoda GET este cea specificata, browserul preia valoarea proprietatii action (in exemplu nostru “script.php”), adauga ? apoi concateneaza continutul informational sub forma perechi cheie-valoare.

Cheile reprezinta numele componentelor din formular (specificate cu proprietatea name), iar valorile sunt efectiv continutul campurilor completate (sau specificate cu proprietatea value).

Concatenarea va produce urmatorul url:

Se observa ca perechile cheie-valoare sunt codificate intr-o maniera directa: “cheie=valoare” si sunt separate prin &. Transmiterea se face direct prin URL, iar contintul informational este direct vizibil pentru utilizator;

Daca pentru trimitere specificam metoda POST, browser-ul va construi o cerere HTTP de tip post catre resursa ceruta (in exemplul nostru, “script.php”), iar perechile cheie-valoare se vor afla in continutul cererii HTTP catre server. In acest caz, informatiile nu mai sunt vizibile direct utilizatorului, insa in cererea HTTP ele sunt scrise in clar.

Iata un exemplu de cerere HTTP folosind metoda POST:

Accesul la informatiile trimise in PHP

Informatiile trimise prin intermediul variabilelor GET si POST pot fi regasite in PHP in vectorii asociativi $_POST si $_GET. Cheile lor reprezinta numele campurilor (definite cu proprietatea name, in HTML) iar valorile reprezinta valorile efective introduse de utilizator.

$_GET si $_POST sunt variabile super-globale si sunt vizibile oriunde in cadrul unui script PHP. Ele pot fi folosite exact ca oricare alt vector asociativ.

Diferenta intre $_GET si $HTTP_GET_VARS

In variante anterioare PHP 5 (si in general in cod scris cu versiuni mai vechi de PHP), pentru accesul la informatiile trimise cu GET sau POST, se foloseau$HTTP_GET_VARS (respectiv $HTTP_POST_VARS). Acestea functionau in mod perfect asemanator cu $_GET (si $_POST). Exista insa diferente.

$HTTP_GET_VARS este o variabila globala (nu super-globala), ceea ce inseamna ca trebuie declarata cu global $HTTP_GET_VARS pentru a putea fi folosita interior unei functii (sau clase).

Variabilele $HTTP_GET_VARS si $HTTP_POST_VARS sunt deprecated si din PHP 6. ele nu vor mai fi folosite. Desi inca functioneaza, se descurajeaza folosirea acestora.

PHP – Maniere particulare de trimitere a datelor

Putem profita de maniera de trimitere a informatiilor cu metoda GET, pentru a putea trimite date si mai flexibil (fara sa fim ‘legati’ de necesitatea introducerii formularelor). Astfel, un link de forma:

Este echivalent cu un formular:

in care utilizatorul completeaza cu 10 campul id.

Aceasta abordare permite programatorului de aplicatii web sa particularizeze executia unui script (precum “script.php”), in functie de continutul variabilei id.

Nu exista o corespondenta a acestei abordari pentru metoda POST, insa pot fi trimise valori predefinite folosind tipul hidden.

Exemplu:

Un astfel de input intr-un formular, va avea ca efect trimiterea (alaturi de campul nume_camp) si campul id cu valorea 5.
Input-urile hidden nu sunt vizibile cand afisam pagina HTML)

PHP – Directiva register-globals

Activarea directivei register_globals, permite folosirea directa a variabilelor trimise prin metodele GET si POST, fara a mai folosi variabilele globale $_GET si $_POST. De exemplu, daca register_globals este activat, continutul $_GET[‘form_elem’] poate fi accesat in mod direct prin variabila $form_elem.

Acelasi lucru este valabil si pentru elemente trimise prin POST.

Aparent este mai simplu a opera cu variabile efective $form_elem, decat cu elemente ale unui array asociativ (ex: $_GET[‘form_elem’] )

Cu toate astea, register_globals activata reprezinta un imens potential pericol pentru securitatea unei aplicatii.

Fie urmatorul cod (script.php) executat pe un server cu register_globals activat:

Daca cineva ar accesa script.php?authorized=true, scriptul ar intra in regiunea critica de cod, ignorand complet codul de autorizare (functia authenticated_user ).

Folosirea register_globals este insistent descurajata.

Uploadarea fisierelor

In exemplul de mai jos, avem un formular pentru uploadul fisierelor. El contine elemente in plus fata de formularul standard (prezentat mai sus).

Elementele noi sunt:

  • enctype=“multipart/form-data” – specificand acest camp, continutul fisierelor trimise vor fi “impachetate” in sectiuni separate (se face o distinctie intre modul de codificare a datelor din formular, si fisierele de trimis)
  • input type=“hidden” name=“MA… – seteaza dimensiunea maxima permisa pentru un fisier; valoarea este folosita de script.php (campul poate fi omis)

Continutul script.php:

Explicatii:

  • $target_path – contine calea de pe server
  • basename (…) – functie PHP care intoarce denumirea standard a unui fisier ([nume].[extensie])
  • $_FILES – vector asociativ ce retine toate informatiile despre fisierele primite; Cand script.php este rulat, fisierul uploadat va fi depus intr-o locatie temporara de pe server. Aceasta locatie este retinuta in: $_FILES[‘uploadedfile’][‘tmp_name’] (cheia ‘uploadedfile’ nu este altceva decat numele input-ului din formular). Daca pana la sfarsitul rularii scriptului script.php fisierul nu este mutat intr-o alta locatie (permanenta), acesta va fi sters. Numele efectiv al fisierului este retinut in $_FILES[‘uploadedfile’][‘name’]
  • move_uploaded_file – functie care realizeaza mutarea fisierului la locatia dorita

Mecanismul de sesiuni în PHP

HTTP este un protocol state-less. Cea mai importanta urmare a acestui fapt din punctul de vedere al aplicatiilor web fiind ca, folosind doar protocolul HTTP, un server web nu poate determina daca o cerere este legata logic de una anterioara, de la acelasi client. Capacitatea serverului web de a recunoaste ca o cerere face parte dintr-o succesiune de cereri de la acelasi client este utila, spre exemplu, pentru implementarea unei zone protejate cu parola in aplicatie (caz in care utilizatorul se autentifica odata, apoi toate cererile de la acest client sunt considerate autentificate pâna la logout).

Pentru a implementa un asemenea comportament, se utilizeaza mai multe metode aplicate peste nivelul HTTP al server-ului web, in functie de tipul de server si de limbajul de programare. In PHP, cel mai utilizat mecanism pentru retinerea informatiilor despre starea clientului este sesiunea.

Mecanismul pentru sesiuni este foarte simplu:

1. Un script PHP initiaza o sesiune cu session_start()

2. Se verifica cookie-urile trimise in REQUEST-ul HTTP sau linia de REQUEST a metodelor GET sau POST.

  • Daca nu exista un COOKIE cu numele default PHPSESSID (sau nu exista parametrul SID in linia REQUEST), se initiaza o sesiune noua, care primeste un session id aleator, si se creeaza in directorul temporar al sistemului un fisier in care vor fi pastrate informatiile sesiunii
  • Altfel, se utilizeaza valoarea parametrului (PHPSESSID sau SID din GET sau POST) pentru a porni sesiunea cu ACEL session id, care se presupune ca exista.

3. Dupa ce sesiunea a fost pornita, utilizatorul are acces Read / Write la datele din fisierul temporar prin intermediul variabilei superglobale $_SESSION (care este un array).

4. Sesiunea se inchide la expirarea unui timp sau prin functia session_destroy()

Prin utilizarea sesiunilor, limitarea duratei de viata a variabilelor la rularea unui script poate fi inlaturata. Valori utile pot fi salvate ca variabile de sesiune, si utilizate in orice script.

Folosirea sesiunilor pentru autentificare

Un caz de utilizare comun pentru sesiuni in programarea web (sesiunile nu sunt o tehnica limitata la PHP) este autentificarea si pastrarea in stare autentificata a unui utilizator al aplicatiei, in timpul navigarii acestuia prin mai multe pagini web. Similar si oarecum cuprins in acest exemplu este si cosul de cumparaturi dintr-un magazin virtual (in care se pastreaza produsele cumparate pâna intr-un punct, chiar daca utilizatorul vede mai multe pagini : detalii produs, comparatie produse …).

Pentru autentificarea unui utilizator, trebuie urmariti urmatorii pasi:

1. Login form: utilizatorului ii se cere sa introduca informatii intr-un formular, care apoi este transmis scriptului de autentificare

2. Scriptul verifica informatiile de autentificare (spre exemplu, perechea user & password) si intoarce o decizie: informatiile sunt valide sau invalide.

3. In cazul in care informatiile sunt valide, in script se poate inregistra o variabila de sesiune care sa fie apoi folosita ca referinta pentru starea autentificata. Aceasta este de cele mai multe ori un flag, sau o variabila care contine numele de utilizator si care este stearsa (cu unset) la logout, dar poate fi si alteceva, in functie de complexitatea si cerintele aplicatiei.

Inregistrarea unei variabile de sesiune se facea in PHP4 cu session_register(), dar aceasta functie este deprecated acum.

Modalitatea de inregistrare / deinregistrare a unei variabile de sesiune este crearea / stergerea unei perechi cheie – valoare in array-ul superglobal $_SESSION.

Cookies in PHP

Un cookie este un fisier de dimensiuni reduse trimis de server si salvat pe calculatorul personal. In acest fisier pot fi salvate diverse informatii, dar cel mai des este utilizat pentru identificarea utilizatorilor.

setcookie() defineste un cookie ce va fi trimis impreuna cu header-ele HTTP. De aceea, cookie-urile trebuiesc trimise inaintea oricarui output. Acest lucru inseamna ca functia trebuie apelata inaintea oricarui output, inclusiv tagurile , sau spatii albe.

Odata setate, cookie-urile pot fi accesate la urmatoarea incarcare a paginii cu ajutorul variabilei $_COOKIE sau $HTTP_COOKIE_VARS. Valorile cookie-urilor exista deasemenea in $_REQUEST.

Toti parametrii in afara de $name sunt optionali.

  • name – numele cookie-ului
  • value – Valoarea stocata in cookie. Aceasta valoare poate fi accesata in felul urmator: $_COOKIE[‘name’]
  • expire – Timpul exprimat in secunde pana la expirarea cookie-ului. ex: time() + 60*60*24*30 – cookie-ul va expira in 30 de zile. Daca nu este specificata aceasta valoare, expire ia valoarea default, adica 0 si va expira la inchiderea sesiunii (adica la inchiderea browser-ului).
  • path – Calea pe server unde va fi disponibil cookie-ul. Daca este setat la ‘/’, cookie-ul va fi disponibil pe intreg domeniul. Valoarea default este directorul din care este setat cookie-ul.
  • domain – domeniul unde este disponibil cookie-ul. De exemplu: pentru ca un cookie sa fie valabil pe toate subdomeniile a “itassistant.org” atunci aceasta valoare trebuie setata la ‘.itassistant.org’. Daca il setam la ‘www.itassistant.org’ atunci cookie-ul va disponibil doar pe subdomeniul www.
  • secure – specifica daca un cookie trebuie transmis printr-o conexiune https de catre client (true). Pe partea de server, aceasta datorie revine programatorului: ($_SERVER[“HTTPS”])
  • httponly – specifica daca un cookie poate fi accesat doar prin protocol HTTP (true). Asta inseamna ca un cookie nu va fi disponibil de exemplu in JavaScript. Acest parametru poate fi utilizat pentru a opri furtul de identitate prin atacuri de tip XSS.

Serializare in PHP

Serializarea este procesul de conversie a unei structuri de date sau a unui obiect intr-o secventa de biti pentru a putea fi stocat intr-un fisier, un buffer sau transmis prin intermediul unei retele pentru a putea fi utilizat in alt mediu.

PHP are definite doua metode ce se ocupa de acest aspect: serialize() si unserialize(). In PHP resursele nu pot fi serializate resursele (file pointers, sockets, etc.). Aceste metode apeleaza _ _sleep(), respectiv _ _wakeup() inainte de a incepe procesul de serializare / deserialziare. Acest lucru poate deveni util in cazul in care se doreste executarea unor operatiuni de clean-up sau a inchiderii conexiunii la baza de date. Deasemenea functia _ _sleep() poate fi utilizata pentru a specifica atributele obiectului ce se doresc a fi serializate. Aceasta trebuie sa intoarca un array cu atributele obiectul ce se doresc a fi serializate.

Leave A Reply