»  Pagina principala  »  PHP si mysql »  Autentificarea in paginile restrictionate

Autentificarea in paginile restrictionate

Dupa cum probabil stiti, anumite site-uri au accesul restrictionat si continutul lor poate fi accesat numai de catre anumite persoane autorizate. Una dintre variantele prin care poate fi verificat faptul daca un anumit utilizator are dreptul de a accesa un anumit site este cererea introducerii unui nume de utilizator si a unei parole in momentul in care persoana respectiva incearca sa acceseze aceste informatii. In momentul acceasarii paginii web este trimis un mesaj care indica faptul ca autentificarea este necesara. Programul de navigare va afisa o caseta de dialog care permite introducerea unui nume de utilizator si a unei parole. Dupa introducerea informatiilor necesare va fi accesata din nou pagina web dar, de aceasta data, variabilele predefinite PHP_AUTH_USER, PHP_AUTH_PW si PHP_AUTH_TYPE vor contine numele de utilizator, parola, respectiv tipul autentificarii. Pentru a trimite mesajul care cere autentificarea este utilizata functia header ( ) . Nu este posibila decat autentificarea de tip "Basic". Un exemplu in care este prezentata o autentificare inaintea accesarii informatiilor este prezentat in continuare:

Exemplu
Rezultat
<?php
if (!isset ($_SERVER['PHP_AUTH_USER'])) {
header ('WWW-Authenticate: Basic realm="php4"');
header ('HTTP/1.0 401 Unauthorized');
echo 'Pentru accesarea continutului este necesara o autentificare!';
exit;
}
else {
echo "<html><head>";
echo "<title>Autentificare</title>";
echo "</head><body>";
echo "<p>Salut <b><i>{$_SERVER['PHP_AUTH_USER']}</I></B>!";
echo "<p>Parola introdusa este <b><i>{$_SERVER['PHP_AUTH_PW']}</i></b>.";
echo "</body></html>";
}
?>

Pentru o compatibilitate cat mai mare, cuvantul Basic trebuie scris cu majuscula, valoarea pentru realm trebuie sa fie cuprinsa intre ghilimele (nu intre apostrofuri), iar intre HTTP/1.0 si 401 trebuie sa existe exact un spatiu. in acest exemplu, numele de utilizator si parola sunt afisate. In practica, se va verifica validitatea lor, de obicei printr-o interogare a unei baze de date. In situatia in care este apasat butonul Cancel, pagina web generata va contine un mesaj de avertizare.

Functia setcookie.
In PHP exista o functie speciala care poate fi folosita pentru crearea cookie-urilor si anume setcookie ( ). Functia are sase parametri, doar prezenta primului fiind obligatorie:
- nume: sir de caractere care reprezinta numele cookie-ului;
- valoare: sir de caractere care reprezinta valoarea cookie-ului (informatia corespunzatoare);
- expirare: un numar intreg care indica momentul de timp in care cookie-ul nu va mai putea fi utilizat;
- cale: sir de caractere care reprezinta o cale generica a fisierelor care pot accesa cooke-ul;
- domeniu: sir de caractere care reprezinta domeniul pe care trebuie stocate fisierele care pot accesa cookie-ul;
- securitate: numar intreg care, daca are valoarea 1, arata ca informatia poate fi transmisa doar folosindu-se o conexiune HTTPS securizata.
Daca unul dintre parametri este prezent, atunci toti parametrii anteriori trebuie sa fie prezenti. Daca unul dintre acestia nu este utilizat, se va folosi in pozitia respectiva fie sirul vid, fie valoarea 0. In continuare sunt prezentate cateva exemple de apeluri prin care sunt create cooke-uri:
- setcookie ("TestCookie", "PHP4");
- setcookie ("TestCookie", "Site", time ( ) + 3600);
// expira dupa o ora de la creare
- setcookie ("TestCookie", "Test", time ( ) + 3600, "/articole/", " .php4.as.ro",1);
Cu ajutorul functiei setcookie ( ) este posibila si stergerea cookie-urilor. Urmatoarele exemple ilustreaza modul in care poate fi realizata aceasta operatie:
setcookie ("TestCookie", "", time ( ) - 3600);
sau
setcookie ("TestCookie", "", time ( ) - 3600, "/comenzi/", ".php4.as.ro", 1);
Se observa ca momentul expirarii este setat ca fiind anterior momentului executarii operatiei de stergere. Exista posibilitatea de a crea siruri de cookie-uri prin simpla introducere a parantezelor drepte in denumiri. Un exemplu de creare si utilizare a unor astfel de siruri este prezentat in continuare:
setcookie ("cookie[three]", "cookiethree");
setcookie ("cookie[two]", "cookietwo");
setcookie ("cookie[one]", "cookieone");
if (isset ($cookie)) {
while (list ($name, $value) = each ($cookie)) {
echo "$name == $value<br>";
}
}

Pentru a accesa cookie-urile stocate pe calculatorul unui vizitator al paginii Web, este disponibil vectorul $_COOKIE. Vom prezenta in continuare un exemplu cu ajutorul caruia se genereaza o pagina care contine denumirile si valorile tuturor cookie-urilor.

Exemplu
Rezultat
<?php
foreach ($_COOKIE as $cheie => $valoare)
echo "$cheie = $valoare<br>";
?>
culoare_table = #FFFFFF
php4forum_data = a:0:{}
culoare_fundal = #FFFFFF
culoare_text = #000099
culoare_link = #000099
Redirect = 228876057
PHPSESSID = 0316f22d96096651f440a3815725609a

Fisierele pot fi incarcate pe un server daca utilizatorul foloseste un program de navigare compatibil RFC-1867; pot fi utilizate ultimile versiuni ale celor mai cunoscute browser-e. Este posibila incarcarea atat a fisierelor text, cat si a celor binare. Folosind autentificarea PHP si functiile de manipulare a fisierelor, avem controlul total asupra utilizatorilor care pot incarca fisiere si asupra operatiilor efectuate cu fisierul incarcat.

Formularul de incarcare
Pentru ca utilizatorul sa poata incarca un fisier, el trebuie sa aiba la dispozitie un formular care sa permita alegerea fisierului. Un astfel de formular poate fi creat, de exemplu, folosind limbajul HTML standard. In continuare este prezentat un document HTML care genereaza o pagina web care permite alegerea unui fisier si incarcarea sa pe un server.
<html>
<head>
<title>
Incarcarea unui fisier pe server
</title>
</head>
<body>
<form enctype="multipart/form-data" action="http://www.php4.as.ro/download/upload.php" method="post">
Alegeti fisierul: <br>
<input name = "fisier" type = "file">
input type = "hidden" name = "MAX_FILE_SIZE" value="1024">
<p>
<input type="submit" value="Trimite fisierul!">
</form>
</body>
</html>

Butonul Browse... poate fi utilizat pentru alegerea unui fisier care urmeaza a fi incarcat. Este posibila specificarea fisierului precizand exact calea in caseta de text afisata. URL-ul care este folosit ca valoare pentru atributul action al marcajului <from> trebuie sa reprezinte documentul php care va realiza incarcarea.

Operatia de incarcare
Asadar, formularul prin intermediul caruia este ales fisierul va fi prelucrat de catre un script PHP. Pentru a manipula fisierele poate fi utilizat tabloul $_FILES. Pentru script-ul care prelucreaza formularul prezentat anterior, informatiile referitoare la fisierul incarcat vor fi acceasate folosind variabila $_FILES['fisier'] care este tot un vector. Elementele acestui vector sunt prezentate in cele ce urmeaza:
- $_FILES['fisier'] ['name']: numele pe care il are fisierul pe calculatorul utilizatorului;
- $_FILES['fisier'] ['tmp_name']: numele temporar pe care il are fisierul pe server dupa incheierea procesului de incarcare;
- $_FILES['fisier'] ['type']: tipul fisierului in cazul in care programul de navigare furnizeaza aceasta informatie; un exemplu ar putea fi image/gif;
- $_FILES['fisier'] ['size']: dimensiunea fisierului, exprimata in octeti;
- $_FILES['fisier'] ['fisier'] ['error']: un cod de eroare generat in urma efectuarii incarcarii.
Fisierul va fi stocat pe server in directorul care contine fisierele temporare. O secventa de instructiuni PHP care poate fi folosita pentru a prelucra fisierul incarcat si a-l muta in directorul dorit este urmatoarea:
<?php
if (is_uploaded_file ($_FILES['fisier'] ['tmp_name')) {
copy ($_FILES['fisier'] ['tmp_name'], "/directorul/dorit");
}
else {
echo "Eroare de transfer " . $_FILES['fisier'] ['name'];
}
?>

O varianta alternativa ar fi:
<?php
move_uploaded_file($_FILES['fisier'] ['tmp_name'], "/directorul/dorit");
?>


Coduri de eroare
Incepand cu versiunea PHP 4.2.0, in urma efectuarii unui transfer, sunt generate anumite coduri de eroare. Versiunea 4.3.0 introduce constante predefinite pentru fiecare dintre aceste coduri. In functie de codul de eroare generat in urma operatiei, trebuie realizate diferite actiuni. Codul de eroare poate fi accesat prin intermediul elementului ['error'] al vectorului care pastreaza informatiile despre fisier. Codurile de eroare care pot fi generate sunt urmatoarele:
- UPLOAD_ERR_OK (0): nu a fost semnalata nici o eroare in timpul transferului; operatia de incarcare s-a incheiat cu succes;
- UPLOAD_ERR_INI (1): dimensiunea fisierului este mai mare decat valoarea maxima permisa (aceasta valoare este specificata in momentul configurarii server-ului si poate fi schimbata modificand fisierul PHP.INI);
- UPLOAD_ERR_FORM_SIZE (2): dimensiunea fisierului este mai mare decat valoarea maxima indicata de directiva MAX_FILE_SIZE care este specificata in formular; aceasta valoare este specificata prin intermediul unui camp ascuns al carui text este MAX_FILE_SIZE;
- UPLOAD_ERR_PARTIAL (3): fisierul a fost incarcat doar partial;
- UPLOAD_ERR_NO_FILE (4): nu a fost incarcat nici un fisier.

Incarcarea mai multor fisiere
Exista posibilitatea de a incarca mai multe fisiere daca sunt folosite nume diferite pentru marcajul <input> utilizat pentru afisarea casetei de text si a butonului folosite pentru alegerea fisierului. De asemenea, este posibil ca fisierele incarcate sa fie organizate automat intr-un vector. Pentru aceasta, la numele folosite trebuie adaugate caracterele ' [ ] '. Un exemplu este prezentat in continuare:
<form action = "http://www.php4.as.ro/download/upload.php" method = "post" enctype = "multipart/form-data">
Alegeti fisierele:<br>
<input name = "fisiere[]" type = "file">
<br>
<input name = "fisiere[]" type = "file">
<br>
<input type = "submit" value = "Trimite fisierele">
</form>

Sa presupunem ca am ales sa incarcam fisierele POZA1.GIF si DOC1.PDF. In acest caz, $_FILES['fisiere'] ['name'] [0] va avea valoarea POZA1.GIF, in timp ce $_FILES['fisiere'] ['name'] [1] va avea valoarea DOC1.PDF. Dimensiunile celor doua fisiere pot fi determinate folosind valorile $_FILES['fisiere'] ['size'] [0], respectiv $_FILES['fisiere'] ['size'] [1].

Includerea fisierelor
Deseori, mai multe pagini web pe care le cream trebuie sa contina secvente identice. Evident, putem copia secventele dintr-un fisier in altul, dar aceasta varianta, pe langa faptul ca este incomoda, duce la un consum marit de spatiu pe server si, in cazul in care secventele sunt lungi sau sunt folosite in foarte multe pagini, problema este destul de importanta. Interpretorul PHP permite pastrarea secventelor comune in fisiere separate si accesarea acestora din cadrul altor documente PHP. Pentru a accesa un astfel de fisier, poate fi utilizata directiva include. Practic, din punct de vedere logic, tot continutul fisierului inclus este inserat in pozitia in care apare directiva. Sintaxa acestei directive este include fisier;. Sa presupunem ca avem un fisier numit HELLO.TXT cu urmatorul continut:
<?php
echo "Pagina de test";
?>

In continuare aveti un model in care puteti vedea cum poate fi inclus acest fisier intr-un document php.
<html>
<head>
<title>
Pagina cu fisier inclus
</title>
</head>
<body>
<?php
include "HELLO.TXT";
?>
</body>
</html>

Pentru ca fisierul inclus sa fie interpretat, acesta trebuie obligatoriu sa indice faptul ca secventele de text din cadrul sau reprezinta instructiuni php. Asadar, prezenta constructiei <?php... ?> este necesara pentru ca textul sa fie interpretat corect. Daca fisierul HELLO.TXT ar contine doar secventa echo "Pagina de test";, atunci acesta nu ar fi interpretat ca fiind cod php, ci ca fisier html. Aceasta se datoreaza faptului ca in momentul includerii unui fisier se iese din modul PHP si tot textul este interpretat ca fiind cod HTML. Dupa interpretarea textului din fisierul inclus se intra din nou in modul PHP. In concluzie, folosirea celor doua fisiere este echivalenta cu utilizarea urmatorului fisier:
<html>
<head>
<title>
Pagina cu fisier inclus
</title>
</head>
<body>
<?php
echo "Pagina de test";
?>
</body>
</html>

(Mai multe amanunte despre folosirea functiei include, precum si exemple gasiti in articolul Construieste un site cu PHP)

Includerea in cadrul functiilor
Daca directiva de includere apare in cadrul unei functii, atunci se considera ca toate instructiunile din cadrul fisierului inclus fac parte din corpul functiei. Asadar, domeniul de vizibilitate al variabilelor folosite in fisierul inclus este acelasi cu domeniul pe care l-ar fi avut daca ar fi aparut in cadrul functiei. Pentru a ilustra acest aspect vom considera un fisier var.txt care contine secventa:

Exemplu
Rezultat
<?php
$culoare = "verde";
$fruct = 'mar';
?>
si urmatorul document PHP:
<?php
function fructe ( ) {
global $culoare;
include 'var.txt';
echo "un $fruct $culoare<br>";
}
fructe ( );
echo "un $fruct $culoare<br>;
?>
un mar verde
un verde

Dupa cum se poate vedea, variabilele definite in cadrul fisierului inclus au domeniul de vizibilitate corespunzator functiei fructe ( ). Din aceste motive valoarea variabilei $fruct nu este disponibila in afara functiei. Valoarea variabilei $culoare este disponibila si in afara functiei, deoarece a fost declarata ca fiind o variabila globala. Asadar, instructiunea echo din cadrul functiei duce la afisarea mesajului un mar verde, deoarece ambele valori ale variabilelor sunt disponivile, iar instructiunea din afara functiei duce la afisarea mesajului un verde, deoarece, in afara functiei, variabila $fruct nu a fost definita anterior si este automat initializata cu sirul vid.

Includeri prin HTTP
Dupa cum ati observat, directiva include are ca parametru un sir de caractere care contine numele fisierului care va fi inclus. Acesta poate fi orice URL valid, asadar este posibila includerea unui fisier aflat pe un alt server. Un exemplu ar putea fi include "http://www.site-ul.meu/pagina.mea";. O astfel de directiva functioneaza doar daca se foloseste PHP 4.3.0 sau o versiune ulterioara.

Includerea unui fisier o singura data
Uneori, mai ales in situatiile in care se folosesc variabile pentru numele fisierelor incluse, este posibil ca anumite fisiere sa fie incluse de mai multe ori. De obicei, fisierele incluse contin definitii ale unor functii sau clase, motiv pentru care este de dorit ca un astfel de fisier sa nu fie inclus de mai multe ori. Pentru ca un fisier sa fie inclus o singura data, se utilizeaza o directiva alternativa numita include_once. Dupa cum rezulta din denumire, un fisier va fi inclus o singura data. Cu alte cuvinte, in momentul in care se cere includerea unui fisier, se verifica daca acesta a fost deja inclus si in aceasta situatie directiva nu are nici un efect (fisierul nu este inclus inca o data).
Alternative:
Pe langa directivele include si include_once exista doua alte directive a caror utilizare are un efect aproape echivalent. Acestea sunt require (echivalenta cu include) si require_once (echivalenta cu include_once). Singura diferenta dintre include si require (respectiv dintre include_once si require_once) este data de modul in care este tratata situatia in care fisierul care se doreste a fi inclus nu exista sau nu este disponibil. In cazul directivelor include si include_once este generat un avertisment si executia script-ului continua fara ca fisierul sa fie inclus. Practic, din punct de vedere logic, este ignorata directiva. In cazul directivelor require si require_once este generata o eroare fatala si executia script-ului este intrerupta. Asadar, in situatiile in care este absolut necesara existenta fisierului, pentru a nu aparea efecte bizare, trebuie utilizata directiva require, respectiv require_once.

Starea conexiunii
In PHP, conexiunea poate avea una dintre cele trei stari posibile:
- NORMAL (0): starea normala de functionare;
- ABORTED (1): utilizatorul care acceseaza pagina generata de script-ul aflat in executie s-a deconectat (de obicei prin apasarea butonului Stop al programului de navigare);
- TIMEOUT (2): a fost atinsa limita de timp impusa de PHP.
Pentru fiecare dintre cele trei stari exista un indicator (flag) care este setat sau nu in functie de starea conexiunii. In functie de script, este necesar sau nu ca executia acestuia sa se incheie in momentul in care este intrerupta conexiunea. De exemplu, in cazul in care script-ul actualizeaza o baza de date ar fi de dorit ca executia sa continue. In principiu, este indicat ca script-urile sa isi incheie executia chiar daca datele de iesire nu vor mai fi trimise utilizatorului. Pentru a decide daca executia script-ului se va incheia in momentul intreruperii conexiunii puteti (sau nu!) sa apelati functia ignore_user_abort ( ). Implicit, in momentul in care conexiunea este intrerupta, se intrerupe si executia script-ului. Este posibil (chiar recomandabil!) sa fie definita o functie care va fi executata inaintea intreruperii executiei script-ului. Aceasta poarta denumirea de functie de dezactivare (shutdown function) si este definita la fel ca orice alta functie. Pentru a specifica faptul ca o anumita functie trebuie apelata inaintea intreruperii executiei, aceasta trebuie inregistrata ca fiind functie de dezactivare. Aceasta se realizeaza printr-un apel al functiei registrer_shutdown_function ( ). In cadrul functiei se poate testa daca executia a fost determinata de intreruperea conexiunii prin apelarea functiei connexion_aborted ( ). Aceasta va returna valoarea TRUE daca a fost intrerupta conexiunea. Functia de dezactivare va fi apelata automat si in cazul in care este depasita limita de timp. In cadrul functiei se poate testa daca un astfel de eveniment a avut loc prin apelarea functiei connection_aborted ( ) care returneaza valoarea TRUE in cazul depasirii acestei limite. Exista posibilitatea de a testa ambele indicatoare printr-un singur apel al functiei connection_status ( ). Functia va returna un numar intreg ai carui biti reprezinta indicatoarele. De exemplu, daca sunt setate indicatoarele ABORTED si TIMEOUT, valoarea returnata va fi 3. Trebuie remarcat faptul ca este posibil ca indicatorii ABORTED si TIMEOUT sa fie ambii setati la un moment dat. Aceasta situatie poate aparea in cazul in care intreruperea conexiunii este ignorata. PHP va detecta faptul ca a fost intrerupta conexiunea si va seta indicatorul corespunzator. Totusi, executia script-ului va continua si este posibil sa expire si limita de timp, moment in care este setat si indicatorul TIMEOUT. Implicit, limita de timp este de 30 de secunde, dar ea poate fi modificata folosind functia set_time_limit ( ).

Fisiere aflate la distanta
Asa cum am spus in sectiunea dedicata includerii fisierelor, incepand cu versiunea PHP 4.3.0 este posibila includerea de fisiere aflate pe alte server-e. Evident, este posibila utilizarea de fisiere aflate pe alte server-e si in alte scopuri. Practic, in aproape toate functiile care manipuleaza fisiere, pot fi folosite atat fisiere locale, cat si fisiere alfate la distanta. In continuare este prezentat modul in care pot fi citite date dintr-un fisier aflat pe server:
<?php
// accesam fisierul si setam atributul r de la citire (read)
$file = fopen ("locatia/fisierului/nume_fisier.extensia", "r");
if (!$file) {
echo "Fisierul nu poate fi accesat!\n";
exit;
}
... // citirea datelor din fisier
// inchiderea fisierului
fclose ($file);
?>

Pentru a scrie in fisier se poate folosi o secventa de tipul:
// accesam fisierul si setam atributul w de la scriere (write)
$file = fopen ("locatia/fisierului/nume_fisier.extensia", "w");
if (!$file) {
echo "Fisierul nu poate fi accesat!\n";
exit;
}
... // scrierea datelor in fisier
// inchiderea fisierului
fclose ($file);
?>

Puteti folosii aceste idei pentru a creea o pagina cu acces restrictionat, si unde sa scrieti intr-un fisier pe server datele visitatorului (cum ar fi adresa lui de ip, host, timpul cat a stat pe pagina respectiva, ce pagini a vizitat etc...). Unele din aceste idei le gasiti in pagina de download in "forum in php fara mysql" (unde exista o pagina de administrare cu acces restrictionat - vedeti forum-ul) si in trafic monitor - "php-web-statistic" (unde veti vedea ca este monitorizata fiecare pagina in parte si datele sunt salvate intr-un fisier text iar rezultatul il puteti vedea in monitorizarea traficului de pe acest site). Pentru alte intrebari si nelamuriri va astept pe forum.





Link-ul autorului:
www.tutoriale.far-php.ro

Comentarii




Voteaza acest articol!
 



Trimite un comentariu!

Nume *
E-mail *
Comentariu *
  Vreau sa fiu anuntat de urmatoarele mesaje la acest articol

Security image

Fanache A. Remus

www.farsoft.far-php.ro - portofoliu
http://www.farsoft.far-php.ro

Cloud tag

tutorial, photoshop, html, css, javascript, flash, php, mysql, grafica 3D, tutorial, coduri, scripturi, generator de coduri, cursuri php