Studiul securită ții bazelor de date implementate în [631894]

Universitatea POLITEHNICA din București
Facultatea de Electronică, Telecomunicații și Tehnologia Informației

Studiul securită ții bazelor de date implementate în
sistemul de gest iune a bazelor de date MariaDB

Lucrare de licență
Prezentată са сеrіnță раrțі ală реntru оbțіnеrеа tіtluluі dе
Ingіnеr în dоmеnіul Electronic ă, Telecomunicații și Tehnologia Informație i
рrоgrаmul dе ѕtudіі Саlсulаtоаrе șі Теhnоlоgіа Infоrmаțіеі

Conducător științific Absolvent
Ș.L. Pupezescu Valentin Istudor Laurențiu -Cosmin

Anul 2017

CUPRINS

Lista figuri……………………………………………………………………………………………………….. ………………………………….. 9
Lista acronime ………………………………………………………………. ……………………………………………………………………. 11
Introducere ………………………….. ………………………….. ………………………….. ………………………….. ………………………… 13
1. Sisteme de gestiune a bazelor de date rela ționale ………………………….. ………………………….. …………………………. 15
2. Probleme de securitate într -o aplicație WEB ………………………….. ………………………….. ………………………….. ……17
2.1 Probleme de securitate ale serverului WEB ………………………….. ………………………….. ………………………….. 17
2.2 Probleme de securitate ale serverului de baze de date ………………………….. ………………………….. …………….. 18
3. Descierea aplicației ………………………….. ………………………….. ………………………….. ………………………….. …………. 20
3.1 Prezentare specific aplicație ………………………….. ………………………….. ………………………….. …………………… 20
3.2 Tehnologii folosite ………………………….. ………………………….. ………………………….. ………………………….. ……. 20
3.3 Kali Linux și uneltele sale ………………………….. ………………………….. ………………………….. ……………………… 24
3.4 Baza de date a aplicației. Diagrama bazei de date ………………………….. ………………………….. ………………….. 27
3.5 Arhitectura aplicației. Diagrama UML ………………………….. ………………………….. ………………………….. …….. 29
4. Prezentarea aplicaț iei. Functionalități principale și măsuri luate pentru securizarea aplicației …………………….. 32
5. Prezentarea instrumentelor folosite în testare ………………………….. ………………………….. ………………………….. …..41
6. Testarea aplicației nesecurizate ………………………….. ………………………….. ………………………….. …………………….. 43
7. Testarea aplicației securizate ………………………….. ………………………….. ………………………….. ………………………… 52
8. Concluzii ………………………….. ………………………….. ………………………….. ………………………….. ……………………….. 55
9. Bibliografie ………………………….. ………………………….. ………………………….. ………………………….. ……………………. 57
Anexa 1 ………………………….. ………………………….. ………………………….. ………………………….. ………………………….. …59

Listă figuri

Figura 3.1 Sistemul Linux
Figura 3.2 Diagrama bazei de date ddbase
Figura 3.3 Arhitectura pe 2 nivele
Figura 3.4 Arhitectura pe 3 nivele
Figura 3.5 Diagrama deployment a aplicației
Figura 3.6 Diagrama user case a aplicației
Figura 4.1 Formular de logare în aplicație
Figura 4.2 Formular de înregistrare a contului d e utilizator
Figura 4.3 Conectarea la baza de date
Figura 4.4 Preluare a datelor din formular
Figura 4.5 Inserare date în baza de date
Figura 4.6 Inserare date în baza de date folosind declarații pregătite
Figura 4 .7 Verificare username și parolă
Figura 4.8 Protecție împotriva SQL Injection folosind funcții
Figura 4.9 Protecție împotriva SQL Injection folosind declarațoo pregătite
Figura 4.10 Delogarea de pe site
Figura 4.11 Meniu site utilizator neînregistrat
Figura 4.12 Meniu site utilizator înregistrat
Figura 4.13 Pagina Home a aplicației
Figura 4.14 Personal feed
Figura 4.15 Inserare postare în baza de date
Figura 4.16 Inserare postare în baza de date folosind declarații pregătite
Figura 4.17 Pagina Public
Figura 4.18 Încărcare avatar personal
Figura 4.19 Pagina Contact
Figura 4.20 Bara de adrese a unui site care foloseste SSL
Figura 6.1 URL posibil vulnerabil la SQL Injection
Figura 6.2 Funcții utilizate în realizarea injectării manuale
Figura 6.3 Rezultat hash -identifier
Figura 6.4 Decriptare parolă
Figura 6.5 Rezultat decriptare parolă
Figura 6.6 Configurare port forward
Figura 6.7 Logare abuzivă
Figura 6.8 Pagina Profile accesată abuziv
Figura 6.9 Sqlmap – listă baze de date
Figura 6.10 Sqlmap – listă utilizatori
Figura 6.11 Sqlmap – listă tabele
Figura 6.12 Sqlmap – descriere tabel a users
Figura 6.13 Sqlmap – afișare conținut tabelă

Figura 6.14 Rezultat OWASP Zap
Figura 6.15 Conturi create automat OWASP Zap
Figura 6.16 Tabela posts după scanarea cu skipfish
Figura 6.17 Rezultat rulare skipfish aplicație nesecurizată
Figura 7.1 Pagina de eroare
Figura 7.2 Apelarea funcției de generare captcha
Figura 7.3 Funcția de generare captcha
Figura 7.4 Formular înregistrare aplicație sigură
Figura 7.5 Rezultat OWASP Zap aplica ție sigură
Figura 7.6 Rezultat sqlmap aplicație sigură
Figura 7.7 Rezultat skipfish aplicație sigură

Listă acronime

BeFF – Browser e Exploitation Framework
CSS – Cascading Style Sheet s
CGI – Common Gateway Interface
DoS – Denial of Service
DDoS – Distributed Denial of Service
HTML – Hyper Text Markup Language
HTTP – Hypertext Transfer Protocol
HTTPS – Hypertext Transfer Protocol Secure
IP – Internet Protocol
Nmap – Network Mapper
OWASP – Open Web Application Security Project
PHP – PHP: Hypertext Preproces sor
SGBD – Sistem de Gestiune a Bazelor de Date
SQL – Structured Query Language
TCP – Transmission Control Protocol
UML – Unified Modeling Language
XSS – Cross -site Scripting
ZAP – Zed Attack Proxy

13

Introducere
Timpul a trecut și re alizările științifice au evoluat într-un mod pozitiv. Totodată au crescut și
cerințele oamenilor în ceea ce privește așteptările pentru cost, calitate , inovativitate, accesibilitate și nu
în ultimul rând securitate. Se dorește creșterea nivelului de trai prin tehnologizarea tuturor lucrurilor care
ne înconjoară. Aceasta atrage după sine pericolul securității oamenilor din cauza creșterii numărul ui de
posibile ținte cibernetice. Atacatorii au prin intermediul electroni celor o varietate de modalități de a
obține date confidențiale pentru victimă sau pot altera integritatea acestor informații .
Omul este parte integrantă a sistemelor tehnologice datorită faptului că nu am ajuns încă la
momentul în care sistemele informatice se pot dezvolta și functiona integral autonom. Astfel, una din
cele mai mari probleme apărute la adresa securității este reprezentată de factorul uman.
Nu numai utilizatorii de rând întâmpină pro bleme când vine vorba de asigurarea unui spațiu
informatic sigur ; problemele de securitate apar și în cadrul firmelor. Peste 70% din companii au parte de
pierderi financiare din cauza incidentelor de securitate. Țintele majore a le acestor atacuri informatice îl
constituie în principal bazele de date datorită importanței și volumului mare de date pe care îl conțin. O
bază de date vulnerabil ă poate fi exploatat ă în variate moduri, iar o firmă care încearcă să creeze o relație
client – ofertant bazată pe încredere nu își permite să devină victima unui atac. Pe lânga pierderile
financiare ar urma o pierdere a clienților care vor alege contracandidatul cu o reputație superioară, fapt
ce va declanșa declinul afacerii .
Pentru a menține securitatea, fieca re co mpanie trebuie să aibă în vedere instruirea personalului
folosind o serie de politici și proceduri. Educarea angajatilor pentru recunoașterea potențialelor
ameninț ări la adresa securității reprezintă un pas important pentru diminuarea influenței factorului uman.
De asemenea este necesară și protecția împotriva atacurilor de tip fizic prin modalități de limitare
a accesului în spațiul destinat serverelor și introducerea unor reguli de siguranță stricte.
În urma acestor atacuri nu au de suferit do ar utilizatori i normali sau firmele ci și reputația
brandurilor care se ocupă cu protecția datelor . Periodic dezvoltatorii adaugă patch -uri care să rezolve
eventualele breșe de securitate ale aplicațiilor sau să prevină apariția acestora.
În contextul actual , datorită ritmului alert în care s -a dezvoltat tehnologia și odată cu ea numarul
de atacuri cibernetice, securitatea a devenit o prioritate . Este nevoie de instruirea unui număr mare de
specialiști în domeniu l securității care să poată ține pasul cu creșterea numarului de hackeri și asigurarea
celor 2 cerințe majore: integritatea datelor și confidențialitatea acestora .

14

15
1. Sisteme de g estiune a bazelor de d ate relațional e
Societatea modernă a zilelor noastre a devenit dependentă de utilizarea sistemelor de baze de date
în activităț i diverse. Pe parcursul unei zile o persoană in teracționează deseori cu bazele de date în
realizarea unor acțiuni de tipul: cumpărături online, înregistrarea pe un site de socializare, rezervarea
unor bilete la film, depunerea unei sume de bani într -un cont bancar , accesarea unui motor de căutare ,
verificarea emailului .
Exemplu : presupunem situaț ia în care ne afl ăm într-un supermarket de unde cumpărăm diferite
produse. Ajunș i la casă, vânzătorul scanează codul de bare al fiecărui produs . Aceste produse sunt căutate
în baza internă de date a magazinului și se verifică prețul fiecărui produs .
Un sistem de baze de date este o modalitate virtuală prin care se menț ine pe un calculator eviden ța
unei aplicații sau a unei activități folosind baze de date [1]. Aceste sisteme de baze de date pot avea
marimi variabile . Astfel unele sisteme pot avea înregistrări de ordinul milioanelor (conturile de pe un site
de socializare cum este facebook ), iar altele po t avea dimensiuni mult mai mici (evidența elevilor unei
clase).
Sistemul de gestiune al bazei de d ate (SGBD) reprezintă un ansamblu de programe specializate
destinate creării, întreținerii și accesă rii bazelor de date.
Principalele modele de organ izare a bazelor de date sunt [1]:
– ierarhic
– rețea
– relațional
– obiect -orientat
Cel mai utilizat model dintre cele menționate este modelul relațional în care datele sunt organizate
în tabele conectate. Aceste model corespunde noțiunii de relație din matematică, unde relație se refera la
o mulțime de entități de același tip.
Încă de la apariție a avut un succes imens care continuă și î n prezent dacă ținem cont de faptul că
majoritatea aplicaț iilor actuale folosesc un sistem bazat pe modelul relațional.
Pe lânga avantajele conferite de simplitatea și precizia acestui model beneficiem și de un li mbaj
standardizat, limbajul SQL, care vine și cu un suport teoretic substanțial. [1]
Modelul relațional presupune structurarea datelor sub forma unor tabele care definesc relații.
Fiecare relație are un nume și atribute, coloanele tabelei, pentru care avem un domeniu de valori posibile.
Domeniul poate fi acelaș i pentru fiecare atribut sau poate avea val ori diferite. Un element al unei relații
se numeste tuplu. Aceasta este echivalentul unei linii din tabelă. [2]

16
O relație are urmatoarele proprietăți [2]:
– numele relației o identifică î n mod unic
– fiecare atribut are denumire unică î n cadrul relației
– într-o celula putem pune doar valori singulare
– toate valorile tuplurilor aparț in domeniului de definire al atributelor
– ordinea atributelor nu contează
– toate tuplurile s unt distincte
Mulțimea tuturor câmpurilor care definesc un subiect formează o înregistrare . Totalitatea
înregistrărilot formează baza de date.

17
2. Probleme de securitate într -o aplicație WEB
Conform unui studiu realizat de Ofcom – Media and Analyst Center un adult petrece aproximativ
20 ore sapt ămânal pe internet . Inevitabil , acesta va intra în contact cu o sumedenie de aplicații WEB care
stochează date importante sau confidențiale pentru utilizator . Aceste date reprezintă ținta răufăcătorilor
cibernetici , iar deț inătorii site -urilor trebuie să le asigure securitatea.
Nevoia de securitate a apărut odată cu modernizarea tehnologiilor . Companiile au realizat că
informația de multe ori este mai valoroasă decât bunurile materiale așa că furtul, modificarea, ștergerea
sau împiedicarea accesului la aceasta ar aduce prejudicii majore individului și firmei .

2.1 Probleme de securitate ale serverului WEB
Un server WEB este un sistem care stochează pagini WEB și le pune la dispoziția clienților
folosind protocolul HTTP. Legătura client -server se realizează pe baza unei aplicații instalate pe server
și care transferă paginile WEB găzduite către client în functie de cerințele utilizatorului. [3]
Prin intermediul serverului WEB, un utilizator poate avea acces la fișierele salvate pe sistemul pe
care rulează. Astfel, trebuie acordată o atenție sporită securității .
Un atacator poate ob ține acces neautrizat la anumite fișiere conținând date importante cum ar fi
parole sau informatii confidențiale prin exploatarea unor bug -uri din serverul WEB sau din script -uri.
A. CGI este un protocol care permite unei pagini WEB sa ruleze un program CGI pe un server.
Aceste scripturi CGI rulează în timp real și se folosesc în paralel cu scripturile HTML pentru a -i
imbunătăți funcționalitatea; le putem asemăna cu niște mini -servere care preiau cereri de la client,
accesează baza de date și întoarce informații către browser [4]. Problema cu aceste scripturi este că pot
contine bug -uri care pot face serve rul vulnerabil pentru atacatori:
– pot afișa informații relevante pentru atacator despre host
– atacatorul poate introduce date care se pot transforma în comenzi executabile care ar dăuna
host-ului

B. Atacurile de tip DDoS (Distributed Denial of Service ) sunt cele mai răspândite modalități de
atac asupra unui server deoarece sunt greu de combătut și provoacă daune majore . Principiul acestui tip
de atac este reprezentat de trimiterea unei cantități mari de date către server folosind o multitudine de
conexiuni la server. Astfel se suprasolicită r ețeaua prin efectuarea unui numă r mare de cereri de la
atacator i și răspunsuri de la server și poate scoate din funcțiune un site pentru câteva ore. Problema cu
aceste atacuri este că orice client poate deveni “atacator” fără voia sa; atacatorii pot accesa oricând
calculatoarele infectate în prealabil de aceștia și pot lansa un atac DDoS fară acceptul clientului .
C. Drepturile de acces – o configurare eronată a permisiunilor pe un server poate determina
portițe de acces pentru atacatori.

18
D. TCP/IP este un protocol de transmitere a datelor pe internet. Acest protocol permite
comunicarea între sisteme indiferent de sistemul de operare instalat. Problema acestui protocol este că
nu a fost gândit inițial pentru securitate ci aveau nevoie de funcț ionalitatea lui. Astfel, un atacator îi poate
exploata vulnerabilit ățile prin interpunerea între client și server și urmarirea traficului generat. [4]
Acest tip de atac se numește “man in the middle”. Pe lângă vizualizarea traficului generat,
atacatorul poate intercepta un mesaj, să îl modifice și să îl trimi tă mai departe către destinație fără c a
utilizatorul să își dea seama.

2.2 Probleme de securitate ale serverului de baze de date
Țintele preferate ale atacurilor informatice sunt reprezentate de bazele de date datorită
conținutului acestora și al volumului de date pe care îl stochează . Astfel trebuie să se asigure îndeplinirea
următoarelor cerințe [5]:
– integritatea fizică și logică a bazei de date
– integritatea elementelor din baza de date
– controlul accesului
– identificare
– disponibilitate
Toate Sistemele de Gestionare a Bazelor de Date au funcționalități care implică limitarea
accesului la anumite date. Astfel se pot atribui fiecărui utilizator drepturi de acces pentru a efectua
operații specifice activității sale. Putem asigura confidențialitatea datelor și totodata alterarea lor
accidentală prin blocarea utilizatorilor la porțiuni din tabelă ce nu le s unt adresate.
Atacatorii pot exploata anumite vulnerabilități pe care le are site -ul folosind diverse metode:
A. SQL Injection reprezintă una din cele mai eficiente tehnici de atac as upra bazei de date a
aplicației deoarece există o multitudine de aplicații care realizează automat acest tip de atac. Această
tehnică presupune modificarea sau crearea unor comenzi SQL pentru dezvăluirea sau alterarea unor
informații din baza de date. Această vulnerabilitate apare atunci când prelucrarea datelor de la u tilizatori
nu se realizează corect, nu se face validarea parametrilor. [6]
B. Criptarea reprezintă tehnica prin care un text clar este transfigurat în alt text, numit text criptat
având ca scop păstrarea unei anumite informații. În cazul în care aceasta aj unge pe mâini nedorite ideal
ar fi să nu se poată obține textul clar dacă nu se cunoaște tehnica de criptare sau cheia folosită.
Folosirea unei metode nesigure de criptare poate determina aflarea parolelor prin diferite tehnici
de atac criptanalitic. Presupunând că atacatatorul a reușit sa obțină câmpul username și parolă din baza
de date, avem nevoie de o metodă de criptare suficient de bună pentru a nu permite aflarea acesteia prin
nicio metodă. Deoarece puterea de calcul a sistemelor informatice a ajuns la un nivel foarte ridicat este
nevoie ca tehnicile de criptare să evolueze proporțional pentru a fi capabile să mențină cantitatea de secret
pe care o ascund.

19
C. Cross -Site Scripting sau XSS este de asemenea o metodă de injectare a unui cod personal într –
o pagina WEB care în mod normal nu prezintă probleme de securitate . Ținta atacului nu este serverul
WEB, codul malițios executându -se direct în browser ul utilizatorului . Aceste atacuri se pot desfășura
dacă sursa datelor ce intră în aplicație nu este verificată sau dacă sunt introduse într -o secvență care este
transmisă clientului fară a fi verificată în prealabil de prezența unui malware. [7]
D. Atacurile de tip brute force reprezintă un tip de atac criptanalitic care presupune o cautare
exhaustivă a parolei prin încercarea tuturor combinațiilor și testarea lor pentru a vedea dacă este cea
corectă . Cu cât lungimea parolei este mai mare cu atât es te mai greu de aflat folo sind această metodă. De
asemenea se recomandă folosirea unei metode de criptare eficientă.
E. Omul reprezintă unul din cele mai mari riscuri asupra securității. În majoritatea cazurilor ,
factorul uman este reprezentat de angajații firmelor care întreprind acțiuni în mod deficitar sau incorect
ducând la probleme se securitate.
Astfel trebuie să existe o politică de securitate bine pusă la punct și o serie de instruiri a le
angajaților pen tru respectarea regulilor și corectarea acțiunilor conform normelor pentru a diminua cât
mai mult riscurile.
Un pericol foarte mare îl reprezintă și acordul firmelor ca angajații să își aducă propriile
dispozitive la locul de muncă pe care le pot folosi î n cadrul sistemelor interne ale companiei (stick -uri
USB , CD -uri, laptopuri etc.). Un sistem de operare cum este Linux Kali poate fi cu ușurință instalat pe
un st ick și folosit în cadrul firmei. O soluție la această problemă este dezactivarea port -urilor USB.
O atenție deosebită trebuie acordată și integrității fizice a serverului. Un individ ar putea atenta
asupra bunei funcționări sau ar putea produce o deteriorare a acestuia . Soluția la această problemă o
reprezintă controlul accesului în incinta serverelor și asigurarea unui server de backup situat în alt spațiu.
Cel de -al doilea server trebuie să preia funcționalitatea serverului principal atunci când acesta este
indisponibil. De asemenea backup -ul ar trebui sa fie făcut la perioade scurte de timp pentru ca atunci
când este nevoie de acesta să se folosească date de actualitate.

20
3. Descierea aplicației
Dear Diary este un site WEB de tip rețea de socializare . Oferă posibilitatea creării unui jurnal
online, putând astfel fi accesat de oriunde doar pe baza unui cont de utilizator depășind funcționalitatea
unui jurnal fizic și oferind numeroase alte avantaje.

3.1 Prezentare specific aplicație
Dear Diary este organizat pe 2 nivele de securitate: public și privat. Utilizatorul îți poate alege
ca postările sale să fie private ș i sa le poată v izualiza doar el sau poate alege ca unele sau toate sa fie
publice, iar ceilalți utilizatori sa le poată citi și aprecia. De asemenea postările publice pot fi citite și de
clienții care nu au cont pe site.
Beneficiile acestui site cu specific social sunt multiple și cuprind:
– utilizatorul poate ține o evidență a amintirilor pe care le poate revedea peste luni sau ani fără a
întâmpina problemele unui jurnal fizic care se poate deteriora odată cu trecerea timpului
– un jurnal clasic se poate pierde, dar Dear Diary se va găsi mereu în același loc
– utilizatorul își poate publica rutina zilnică sau poate împărtăși păreri, impresii sau orice fel de
gând cu cititorii
– utilizatorul poate citi postările altor persoane

3.2 Tehnologii folosite
În real izarea proiectului s -au folosit:
Hardware: – procesor Intel Core i5 – 5200U
– memorie RAM DDR3 8GB
– placa video N vidia GeForce 940M
– hard-disk 1TB

Software: – sistem e de operare : Linux Kali , Ubuntu
– editor de text: Sublime Text
– server: Apache
– baza de date : Maria DB
– limbaje folosite: PHP, CSS, HTML , SQL
– mașină virtuală: VirtualBox

Kali este o distribuție Linux bazată pe Debian concepută în special pentru securitate. Avanta jul
acestei distribuții este că vine cu peste 300 de programe preinstalate pentru testarea vulnerabilităților cum
ar fi: Armitage, Nmap , Aircrack -ng, Grabber sau WireShark . Kali se poate rula direct de pe un live
CD/USB sau poate fi instalat fie nativ fie într-o masină virtual ă [8].

21

Sublime Text este un editor de text care suportă o varietate de limbaje de programare și markup.
L-am preferat în detrimentul altora pentru compatibilitatea cu platforma și limbaje le folosite la proiect,
stabilitate, rapiditate, o multitudine de plug in-uri.

Apache este un server web open -source apărut î n anul 1995 . Conform estimărilor este cea mai
folosită versiune de server fiind utilizată în găzduirea a peste 65% din site-urile WEB din lume.
Wikipedia, spre exemplu, rulează pe un server Apache, iar Google folosește o versiune modificată numită
Google Web Server. Popularitatea acestui server a crescut atât de mult datorită gratuit ății și pentru că
permite găzduirea virtuală , lucru ce conferă posibilitatea de a ține mai multe site -uri pe acelaș i server .
De asemenea Apache permite “content negotiation ” ce constă în redarea unor versiuni dif erite pentru un
document în același URL. Un alt avantaj este că permite a utentificarea bazelor de date care se bazează
pe DBMS (Database Management System) , asa cum este și MariaDB .[9]
MariaDB este un sistem de gestiune a bazelor de date relațional e open source derivat din MySQL.
După ce Sun Microsystems a cumpărat MySQL în anul 2008 , iar mai apoi Oracle a achiziționat Sun
Mycrosystems în 2009 , MySQL a devenit proprie tatea Oracle. Principalii dezvoltatori au plecat de la
MySQL și au înființat o nouă companie pe care au numit -o MariaDB.
Cu Oracle refuzând prelungirea termenului de menț inere a MySQL ca bază de date gratuită și
open source, MariaDB a devinit alegerea cea mai potrivită . Acest lucru pare susținu t și de marile
companii care au adoptat acest SGBD : Google , Wikipedia, Tumblr , booking.com , dar și de unele
distribuții de linux: Ubuntu, Debian, Fedora , Red Hat devenind baza de date implicită în defavoarea
MySQL .[10]

MariaDB a avut cea mai rapidă creștere a popularității pentru o bază de date open source .
Fondatorii au gâ ndit-o ca o alternativă la MySQL , astfel, dacă versiunea celor două SGBD -uri este
aceeași , se pot substitui fară a apă rea probleme de compatibilitate [11]:
– datele și definițiile tabelelor sunt binar compatibile
– toate API, protocoalele și structurile coincid
– conectorii MySQL (PHP, Perl, Python, Java, .NET etc.) functionează pe MariaDB fară a fi
nevoie de vreo schimbare
– pachetul mysql -client functionează și cu MariaDB

Astfel, respectând coincidența versiunilor , pentru s ubstituția celor doua SGBD -uri pur ș i simplu
se dezinstaleaza una ș i se instalează cealaltă fară a aparea probleme la compatibilitate.
Cel mai mare avantaj al SGBD -ului MariaDB este plusul de viteză pe care îl are față de MySQL,
lucru re simțit în operațiunile cu volum de date foarte mare.
PHP este un limbaj de scripting, open source, folosit în special pent ru dezvoltarea aplicațiilor
WEB dinamice și interactive. De cele mai multe ori acesta se folosește integrat în cod HTML , dar poate

22
fi folosit și independent permițând crearea aplicațiilor di n linia de comandă. PHP este un limbaj de
programare server -side a cărui popularitate a crescut datorită urmatoarelor caracteristici [12]:

– simp lu: codul este inclus î ntre marcaje speciale <?php cod ?> fară a fi nevoie de includerea
unor biblioteci sau directive de compilare
– securitate: programatorii au la dispoziț ie o serie de măsuri de siguranță
– familiar: poate fi comparat cu limbaje ca C sau Perl în privința sintaxei
– eficien t: alocarea resurselor se face optim
– flexibil: poate fi integrat î n majoritatea serverelor WEB
– gratuit

Codul PHP se execută pe server și se generează un cod HTML care este trimis clientului. Clientul
primeș te rezultatul rulării script -ului PHP fară a putea vedea codul. Ca mijloc de securitate se poate
configura ca serverul să proceseze toate fișierele HTML folosind PHP.

De asemenea PHP permite și folosirea sa ca limbaj de programare orientată pe obiecte, unde
datele și funcțiile sunt tratate ca obiecte. Această metodă de a folosi PHP conferă o eficiență crescută în
organizarea programelor complexe.

HTML (HyperText Markup Language) este un limbaj de marcare care stă la baza oricărui site
WEB. Paginile HTML sunt formate de obicei din perechi de etichete: una de deschidere <tag> și una de
închidere </tag>, dar există și etichete singulare (exemplu: <br> este o etichet ă care introduce un sfârșit
de linie). Browserul recunoaște aceste etichete, le interpretează și afișează rezultatul. Toate fișierele
HTML încep cu eticheta <html> și se termina cu eticheta </html> și au extensia .html sau .htm. [13]

Un document HTML este format din:
– versiunea documentului
– head -ul delimitat de etichetele <head> și </head> conținând titlul, descrieri de tip meta, script –
uri și legături externe
– body -ul inclus între etichetele <body> și </body> care conține corpul documentului, ceea ce
browserul va afișa pe ecran

Vizualizarea paginior HTML se face folosind un browser. Acesta recunoaște codul HTML și
afișează pe ecran rezultatul.
CSS (Cascading Style Sheets) este un limbaj de stilizare folosit pentru formatarea unei pagini
WEB. Îmbunătățește aspectul paginii și ajută la obținerea unui cod HTML mult mai ordonat și mai
simplu. A fost creat în primul rând pentru a face o separare între p rezentare și conținut. De asemenea
produce și o încărcare mai rapidă a paginii deoarece folosirea CSS are ca rezultat o micșorare a codului
HTML. [14]

23
Codul CSS se poate stoca folosind trei modalități [14]:
– folosind un fișier extern cu extensia .css
– intern, în head
– inline, în interiorul tag -ului HTML
Cea mai folosită metodă este fișierul extern datorită simplității cu care se realizează o eventuală
modificare a site -ului. Pentru aplicarea fișierului .css asupra paginii se inserează între tag -urile <head> o
trimitere folosind tag -ul <link>.
CSS-ul intern se folose ște doar în condițiile în care pagina are caracteristici proprii pe care nu le
împarte cu celelalte pagini. Este identic cu cel extern doar că se folosește în interiorul paginii HTML
folosind tag -ul <style > și atributul <type = “text/css”> . De obicei nu este recomandată folosirea sa.
CSS inline se referă la introducerea codului CSS în interiorul tag -urilor HTML, dar folosind
această metodă pierdem avantajele CSS -ului extern cum ar fi simplitatea, li zibilitatea sau încărcare a mai
rapidă a paginilor.
SQL (Structured Query Language ) este un limbaj de programare folosit pentru managementul
datelor în sistemele de gestiune a bazelor de date relaționale. Inițial a fost lansat de IBM apoi standardizat
de ANSI și ISO. Pe lângă varianta standardizată există o mulțime de versiuni și dialecte.
SQL a fost creat având ca scop îndeplinirea urmatoarelor caracteristici:
– crearea bazelor de date și structuri lor relaționale
– inserare, modificare și stergere a datelor din relatii
– interogări în baza de date
SQL are 2 componente majore [15]:
1) un limbaj de definire a datelor pentru definirea structurii bazelor de date și controlul
accesului la date :
 CREATE TABLE – pentru crearea unui tabel
 ALTER TABLE – modificarea structurii unui tabel existent
 TRUNCATE TABLE – șterge toate datele din tabel
 DROP TABLE – șterge tabelul

2) un limbaj de manipulare a datelor care permite o serie de operații:
 INSERT – pentru inserarea datelor in tabel
 SELECT – pentru afisarea datelor
 UPDATE – actualizarea unui set de date
 DELETE – șterge un set de date

24
În proiectarea unui tabel trebuie avut ă în vedere definirea structurii sale : definirea coloanelor,
definirea constrângerilor de integritate, definirea parametrilor și definirea spațiului unde se creează
tabela.
Constrângerile de integritate sunt reguli care se aplică în cadrul tabelului reprezentând norme de
funcționare. Aceste reguli se verifică automat atunci când se execută o operație și în cazul în care nu se
validează, se generează o eroare și se întrerupe operația.
Constrângerile de integritate pot fi [16]:
– NOT NULL – câmpul nu poate avea valoarea null
– UNIQUE – mai multe inregistrări nu pot avea aceeași valoare
– PRIMARY KEY – se defineste o cheie primară (unică)
– FOREIGN KEY – definește o cheie străină (stabilește o relație între o cheie primară și una
unică în același tabel sau în tabele diferite )
– CHECK – forțează verificarea un ei condiții

Pentru testarea și vizualizarea aplicației folosind un mediu din afara rețelei am ales utilizarea
Ubuntu pe o mașină virtuală, VirtualBox.
VirtualBox este un soft gratuit și open source deținut de Oracle folosit pentru managementul
mașinilor virtuale. Acesta poate fi instalat pe o varietate de sisteme de operare incluzând Linux sau
Windows. VirtualBox permite instalarea unei multitudini de sisteme de op erare pe același computer.

3.3 Kali Linux și uneltele sale
Linux este un grup de sisteme de operare de tip U nix care folosesc nucleul Linux. Linux oferă
suport și poate fi instalat pe o mare varietate de hardware cum ar fi: computere, telefoane mo bile, tablete
sau console video, dar cea mai largă utilizare o are în cadrul serverelor. Dezvoltarea primului sistem
Linux a fost începută de Linus Torvalds , un inginer finlandez , care și -a dorit un sistem similar cu Minix ,
dar cu limitări mai putine. Astfel Linux este un sistem open source sub licență publică generală GNU
GPL. [17]
Componentele unui sistem Linux sunt [18]:
– hardware (memorie, hard -disk)
– nucleu (kernel)
– shell
– utilitare

25

Figura 3.1 Sistemul Linux [19]

Nucleul este componenta sistemului de operare care se în carcă în memorie atunci cand se
pornește computerul. Acesta controlează accesul la dispozitivele hardware ale calculatorului, gestionează
procesele ( deoarece Linuxul este un sistem de operare multitasking ) și memoria . Nucleul rămâne
încărcat în memorie până la oprirea calculatorului.
Shell -ul este interfața cu nucleul. Acesta ascunde compl exitatea kernel -ului și preia co menzile de
la utilizator care sunt executate de kernel.
Utilitarele sunt programe care descriu funcționalitățile unui sistem de operare. În momentul
lansării lor în execuție sunt încărcate de pe hard -disk în memorie , iar dupa terminarea execuției memoria
este eliberată.
Printre avantajele folosirii unui sistem bazat pe linux se numără [20]:
– portabil ( poate rula pe siseme hardware diferite)
– open source (este gratuit și se lucrează constant la îmbunătățirea lui prin contribuția echipelor
de dezvoltare)
– utilizatori multiplii pot accesa resurse comune în același timp
– programe multiple pot rula pe sistem î n același timp
– securitate ( Linux dispune de măsuri de securitate cum ar fi autentificarea sau criptarea
datelor)
– shell ( program special de interpretare a comenzilor )

Sistemele de operare Linux sunt disponibile sub variante numite distribuții. Unele din cele mai
populare distribuții sunt: Ubuntu, Mint, Arch, Kali.
Kali este distribuția de Linux creată și dezvoltată de Offensive Security. Această distribuție este
bazată pe Debian GNU/Linux și a fost concepută în special pentru informatica criminalistică și pentru
testarea securității . Kali este versiunea mai nouă și îmbunătățită a binecunoscutului sistem de operare
BackTrack Linux , folosit de pentestări și atacatori în trecut și vine cu o mulțime de cateva sute de unelte
preinstalate utile în testare. [8]

26
Pentru a face din Kali o distribuție cât mai apropiată de nevoile utilizatorilor acesta vine cu o serie
de modificări:
– utilizator unic ( deoarece majoritatea programelor care rulează pe Kali au nevoie de drepturi
de execuție de la “root” s-a ales varianta conectării cu acest utilizator care are drepturi
asupra întregului sistem de operare )
– în mod implicit, serviciile de internet și bluetooth -ul sunt dezactivate
– Kali Linux dispune de un nucleu modificat specializat pe wireless injection
– sursele de descărcare a uneltelor sunt menținute într -un număr cât mai mic din motive de
securitate

Linux Kali dispune de o varietate de unelte folosite pentru testarea vulnerabilit ăților sau analiza
traficului dintr -o rețea . Unele din cele mai folosite dintre acestea sunt:
Sqlmap este o unealtă open source de testare foarte puternică care automatizeaz ă sistemul de
detectare a vulnerabilităților unui site la sql injection și preluare a bazelor de date. Sqlmap nu se folosește
doar la testare ci și pentru a exploata SQL Injection prin extragerea datelor din baza de date sau chiar
modificarea tabelelor. P entru linux kali nu este nevoie de instalare pentru sqlmap deoarece vine
preinstalat, dar pentru celelalte poate fi procurat de la link -ul http://sqlmap.org . Deoarece este conceput
în python sistemul de operare trebuie să aibă python instalat. [21]
Nmap este un scanner de securitate folosit pentru crearea unei hărți a rețelei utilizat în
descoperirea host-urilor și serviciilor din rețea. Funcționarea acestui instrument se bazează pe trimiterea
unor pachete speciale către host și interpretarea rezultatelor. Avantajul acestui scaner de porturi este că
ia in considerare diferite particularit ăți ale rețelei cum ar fi traficul din rețea la acel moment sau
latența .[22]
Wireshark este un instrument gratuit folosit pentru capturarea și analizarea traficului din rețea.
Acesta are o interfață grafică care simplifică lucrul cu utilizatorul și o varietate de funcț ionalități
incluzând filtrarea și sortarea informației.
Nikto este un scanner open source pentru servere WEB folosit pentru testarea a peste 6500 fișiere
potențial periculoase sau C GI-uri, aplicaț ii depășite de pe server și alte teste asupra serverului.
BeEF este un instrument de testare conceput pentru a lansa atacuri și testa vulnerabilitățile
browserului WEB . De asemenea este o unealtă excelentă pentru testarea slăbiciunilor browser -ului la
atacurile de tip XSS sau alte atacuri ce implică injectarea.
Metasploit sau Proiectul Metasploit este folosit pentru a afla vulnerabilitățile în securitatea
aplicațiilo r și are un rol important în dezvoltarea testelor de securitate.
Ubun tu este cel mai cunoscut sistem de operare bazat pe Linux. Succesul de care se bucură
provine din asemanarea grafică cu binecunoscutul Windows și din ușurința în instalare și utilizare . Inițial
Ubuntu a apărut ca o copie a altei distribuții, Debian , și și-a propus să fie compus mai ales din software
open source.

27
3.4 Baza de date a aplicației . Diagrama bazei de date
Baza de date a aplicației se numeste ddbase și are în componență două tabele legate între ele
printr -o cheie străină. Prima tabelă, users , este tabela care ține evi dența conturilor de utilizator, iar cea
de-a doua este tabela posts care gestionează postările utilizatorilor conectați. Pentru crearea bazei de date
s-a folosit terminalul din Kali Linux , iar pentru vizualizarea grafică MySQL Workbench .
După logarea în sistemul de operare se deschide terminalul și se porneste serverul MariaDB prin
rularea comenzii:
service mysql start
Pentru acest proiect am creat un utilizator nou pentru baza de date căruia i -am atribuit toate
drepturile pe care le are un root (administrator). Înainte de a face asta este nevoie de conectarea la baza
de date folosind ca utiliator root, nefiind necesară introducerea unei parole . Implicit baza de date
MariaDB nu are parolă, dar pentru securitate îi vom atribui ulterior una.
Pentru conectarea la MariaDB rulăm în terminal comanda:
mysql –u root –p
Următoarea etapă constă în crearea unui utilizator nou, stringdot , căruia îi atribuim parola
Ninja123, parolă ce conține litere mici, litere mari și numere din considerente de securitate.
CREATE USER ‘stringdot’@’localhost’ IDENTIFIED BY ‘Ninja123’;
Crearea bazei de date ddbase se face rulând urmatoarea comandă :
CREATE DATABASE ddbase;
Acum că avem baza de date vom atribui utilizatorului creat, stringdot , toate permisiunile necesare
execuției operațiil or într-o bază de date .
GRANT ALL PRIVILEGES ON *.* TO ‘stringdot’ @’localhost’ ;
După setarea permisiunilor avem nevoie de o reactualizare a privilegiilor.
FLUSH PRIVILEGES;
În continuare vom parcurge urmatoarele etape pentru crearea bazei de date:
 logarea folosid userul nou creat
mysql –u stringdot –p Ninja123
 afișare baze de date
show schemas;
 selectare baza de date ddbase
use ddbase;

28
 crearea tabele i users
CREATE TABLE users(
id_user int(11) NOT NULL auto_increment,
name varchar(45) NOT NULL,
username varchar(45) NOT NULL,
password varchar(45) NOT NULL,
email varchar(45) NOT NULL,
gender varchar(45) NOT NULL,
avatar varchar(100),
UNIQUE (username),
PRIMARY KEY(id_user)
);
 crearea tabelei posts
CREATE TABLE posts(
id_post int(11) NOT NULL auto_increment,
username varchar(45) NOT NULL,
postare varchar( 1000) NOT NULL,
date_post datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ,
viewz varchar( 10),
id int(11),
PRIMARY KEY(id_ post),
FOREIGN KEY(id) REFERENCES users(id_user)
);

Pentru crearea diagramei bazei de date se porne ște MySQL Workbench apoi se selectează din
secțiunea “Models” opțiunea “Create EER Model from Database”. Introducem parola utilizatorului
stringdot , selectăm baza de date ddbase și obținem urmatoarea diagramă care exemplifică în mod vizual
structura tabelelor ș i tipul relației dintre acestea:

Figura 3.2 Diagrama bazei de date ddbase

29
3.5 Arhitectura aplicației. Diagrama UML
Calitatea unei aplicaț ii este influențată major de arhitectura acest eia. O arhitectură neadecvată
duce la performanțe scăzute, dezvoltare greoaie, probleme în cazul modificării aplicației , întreținere
dificilă sau lipsa scalabilității . Pe langă acestea este nevoie și de o analiză a constrângerilor tehnice cum
ar fi serverele sau conexiunea .
Atunci când se începe dezvoltarea unei aplicații WEB trebuie luat în calcul un număr mare de de
cerințe cum ar fi: calitatea, funcționalitatea sau posibilitatea integrării acest eia. Un impact important
asupra aplicației îl are alegerea tipului de arhitectură utilizat.
Dacă serverul și clientul sunt amplasate pe același sistem spunem ca avem de -a face cu o
arhitectură cu un singur nivel. Avantajele acestei arhitecturi constau în simplitatea și eficiența sa, dar
presupune costuri ridicate deoarece este nevoie de un echipament performant.
Arhitectura pe 2 nivele sau arhitectura client -server presupune existența unui server care oferă
servicii unui utilizator. Comunicarea este realizată direct fară a exista intermediari . Într-o aplicație
normală clientul vizualizează informația în browser , procesează aplicațiile și trimite cereri către server ,
iar aplicația server controlează accesul la date. Cele două părți componente logica aplicației. Problema
arhitecturii cu 2 nivele o reprezintă stabilirea unui plan de executare a prelucrărilor pentru obținerea unui
echilibru astfel încât să nu avem o încărcare excesivă a serverului sau a clientului. [23]

Figura 3.3 Arhitectura pe 2 nivele
Faptele au confirmat că acest model pe 2 nivele are situații când este depășit și a apărut
necesitatea introducerii celui de -al 3-lea nivel . Modelul pe 3 nivele introduce între client și baza de date
un server de aplicație prin a cărui introducere i se ușurează activitatea prin distribuirea sarcinilor pe mai
multe sisteme. În acest model clientului îi revine doar interfața de sistem cu utilizatorul , logica aplicației
revenind nivelului nou introdus, serverul de aplicație, iar ultimul nivel se ocupă cu accesul la informația
stocată în baza de date.

Figura 3.4 Arhitectura pe 3 nivele răspuns Client Server
baza de
date
cerere
Client Server
aplicație Server
baza de
date

30
Dear Diary este o aplicație care folosește modelul arhitectural cu un singur nivel, dar a fost testată
cu succes și pentru cazul folosirii arhitecturii cu două nivele prin legarea în rețea a sistemului conținând
întreaga aplicație și a unui laptop. Pentru conectarea la site avem nevoie de IP-ul sistemului pe care se
află aplicația . Acest IP il vom introduce î n URL -ul browserul ui laptopului .
Ideal pentru o aplicație de acest tip este folosirea unei arhitecturi pe 3 nivele datorită beneficii lor
oferite :
 scalabilitate (este superioară deoarece codul aplicației și baza de date sunt separate)
 micșorarea traficului în rețea
 flexibilitate (fiecare componentă poate fi înlocuită fară a le afecta pe celalalte)
UML este un limbaj de modelar e vizual, orientat pe obiect , care definește structura și proprietățile
dinamice ale unei aplicații. Acest limbaj tratează aspecte ca proiectarea bazelor de date sau interacțiunea
porțiunilor de cod și este deosebit de important pentru proiectele cu o complexitate mare deoarece
eficientizează și clarifică elementele abstracte. [24]
UML pune la dispoziție o gamă variată de diagrame de modelare pentru acoperi rea întregului
proiect software [25]:
– diagrame de activitate (reprezentarea comportării unei activități la rularea programului)
– diagrame de clase (reprezentarea vizuală a claselor și a legăturilor dintre ele)
– diagrame de componente (se folosesc când părți ale sistemului software comunică între ele prin
intermediul interfețelor)
– diagrame use case (sunt folosite în cadrul întâlnirilor dintre dezvoltator și client pentru a explica
interacțiunea dintre actor, element extern, și sistem)
– diagrame deployment (reprezentarea componentelor fizice ale sistemului și componentele
software din acestea )
– diagrame de secvențe ( reprezentarea relației între obiecte în timpul desfășurării unei operații)
– diagrame package (reprezentarea dependenț elor între pachetele din componența sistemului)

Figura 3.5 D iagrama deployment a aplicației

31

Figura 3.6 Diagrama user case a aplicației

Diagrama use case și diagrama deployment a aplicației Dear Diary a fost creată folosind mediul
de editare de pe siteul https://creately.com/diagram -type/use -case .

32
4. Prezentar ea aplicaț iei. Functionalităț i principale și măsuri luate pentru
securizarea aplicației
Dear Diary este o aplicație WEB destinată utilizatorilor de orice vârstă care caută un loc pentru
a-și expune gândurile, pentru a stoca amintiri sau pentru a citi frânturi din viața altora. Într-o societate
guvernată de tehnologie am oferit posibilitatea utilizatorilor de a beneficia de avantajele unui jurnal
online. Acesta poate fi accesat cu ușurință de oriunde atâta timp cât există o conexiune la internet. De
asemenea înlocuiește vechiul jurnal fizic care ar fi putut fi descop erit și citit de alte persoane decât
deținătorul.
Un vizitator al siteului are drepturi limitate în ceea ce privește vizualizarea conținutului. De
asemenea deoarece nu are acces la vizualizarea paginii Profile acesta nu po ate face nici un fel de postare.
Pentru a beneficia de toate funcționalitățile de care dispune siteul este recomandată înregistrare a unui
cont de utilizator.

Figura 4.1 Formular de logare în aplicație

Vizitatorul își poate crea un cont apasând butonul “Sign Up” din bara de logare și completarea
formularului de înregistrare aferent. Toate câmpurile formularului sunt obligatorii.

4.2 Formular de înregistrare a contului de utilizator

33
După ce vizitatorul completează toate câmpurile și apasă butonul “Sign Up” se verifică dacă
adresa de email este validă, iar username -ul să nu fie folosit de alt utilizator. În cazul în care este deja
folosit apare un mesaj de eroare și posibilitatea de a se intoarce la form ular pentru introduce rea unui alt
nume de utilizator .
Pentru varianta aplicației nesecurizate corespunzător s-a folosit pentru criptarea parolei functia
md5 care livrează ca rezultat o valoare fixă de 128 biți. Această funcție de hash nu mai este sigură și
poate fi relativ ușor de spart folosind un instrument de decriptare.
Pentru varianta aplicației sigure am ales ca metodă de hash SHA 256. Dacă un atacator ar încerca
o tehnică de atac de tip brute force având la dispoziție un calculator performant, pentru o lungime a
parolei de 10 semne alcătuită din caractere alfanumerice , ar dura 5 ani pentru descoperirea sa. De
asemenea am introdus pentru câmpul parolă o lungime minimă de 6 caractere.
Ca protecție suplimentară s -ar fi putut introduce funcționalitatea ca după un număr de încercări
eronate consecutive de logare ale aceluiași IP să fie nevoit să aștepte un anum it timp pentru a putea
reîncerca . Aceasta ar fi o măsură suficientă pentru eliminarea atacurilor de tip brute force.
Înainte de a începe crearea formularului de înregistrare se deschide sesiunea folosind funcția
session_start() , apoi se realizează conectarea la baza de date folosind funcția
require_once (dbconnect.php) .
Sesiunile în PHP reprezintă o modalitate prin care anumite informații se pot menține de la o
pagină la alta. O sesiune începe atunci când un script apelează funcția session_start() și se încheie
atunci când se închide browserul.

Figura 4.3 Conectarea la baza de date

În cazul în care conectarea nu a reușit se declanșează un mesaj de eroare.
După conectarea la baza de date se verifică dacă formularul conține date la apăsarea butonului
“Sign Up” sau dacă e xistă vreun câmp necompletat, iar dacă toate condițiile sunt îndeplinite se preiau
datele din formular.

34

Figura 4.4 Preluare a datelor din formular

Pentru varianta aplicației sigure pentru hash-uirea parolei se folosește funcț ia hash().
$password = hash( ‘sha256’, $_POST[‘register_password’]);
Inserarea datelor în baza de date se face prin formarea și execuția query -ului de inserare folosind
funcția mysqli_query( ) care primește ca argumente numele conexiunii și numele query -ului. În cazul
în care nu s -a putut face inserarea apare un mesaj de eroare, iar daca a reușit afișează succes și
posibilitatea de a reveni la pagina principală pentru logare .

Figura 4.5 Inserare date în baza de date

Pentru a proteja formularul de înre gistrare î mpotriva atacurilor de tip SQL Injection pentru
aplicația sigură putem folosi declara ții pregătite sau funcția mysqli_real_escape_string() care
este utilizată pentru filtrarea caractere lor speciale. În practică este de preferat folosirea declarațiilor
pregătite deoarece sunt considerate mai sigure. Inserarea datelor din formular se realizează în tabela users
în câmpurile sugerate în paranteză .

Figura 4.6 Inserare date în baza de date folosind declarații pregătite

35
După crearea contului de utilizator clientul este gata pentru logarea și accesarea tuturor
funcționalităților oferite de aplicație. Logarea se realizează folosind numele de utilizator (username) și
parola ales e la înregistrare.
Formularul de logare implic ă conectarea la baza de date și compararea datelor preluate din
formular cu cele folosite la înregistrare. Dacă acestea coincid se porneș te sesiunea și se face o
redirecționare către pagina “Public” . În cazul în care numele de utilizator nu a fost găsit î n baza de date
sau parola nu coincide se generează un mesaj de eroare și opțiunea de revenire la pagina principală.
Pentru a compara parola din formular cu cea din baza de date trebuie realizată o criptare a parolei
folosind md5 pentru varianta nesecurizată a aplicației și sha256 pentru varianta sigură.

Figura 4.7 Verificare username și parola

Pentru varianta sigură putem folosi funcțiile mysqli_real_escape_string() care filtrează
caracterele speciale și stripslashes() care elimină backslashurile simple și transform ă backslashu rile
duble î n backslash uri simpl e asupra datelor preluate din formula r.

Figura 4.8 Protecție împotriva SQL Injection folosind funcții

La fel ca și în cazul formularului de înregistrare vom alege însă declarațiile pregătite deoarece
sunt mai sigure.

Figura 4. 9 Protecție împotriva SQL Injection folosind declarații pregătite

Delogarea se realizează apăsând butonul Log Out amplasat în parte de sus a paginilor. La apăsarea
acestuia se produce distrugerea sesiunii folosind funcția session_destroy(). De asemenea la
închiderea browserului se produce o delogare automată din aplicație a utilizatorului .

36

Figura 4.10 Delogare a de pe site

După l ogarea î n contul de utiliza tor meniul siteului se modifică în felul urmator:

Figura 4.1 1 Meniu site utilizator neînregistrat

Figura 4. 12 Meniu site utilizator înregistrat

Home reprezintă pagina de pornire cu care este întâmpinat un vizitator al siteului. Aceasta c onține
informații despre specificul aplicației și funcționalitățile oferite de site. După logarea utili zatorului
această pagină lasă locul paginii de profil a utilizatorului.

Figura 4.13 Pagina Home a aplicației

Profile reprezintă pagina personală a fiecărui utilizator. Aceasta conține informațiile despre
utilizator introduse la înregistrare , un formular prin care se pot face postări (publice sau private) , un
formular de upload pentru avatarul personal și postările personale ale utilizatorului. Dacă utilizatorul se
află pe profilul propriu acesta vede atât postările publice câ t și cele private, iar daca se află pe profilul
unui alt utilizator acesta poate vedea doar postările de natură publică.

37
Postările pe site se fac prin intermediul unui textarea . Implicit postările sunt publice; pentru
postarea unui text privat se bifează căsuța “private”. Inserarea textului se face în tabela posts în câmpul
post, tipul postării se inserează în câmpul viewz , iar pentru identificare se inserează numele de utilizator
în coloana username .

Figura 4.14 Personal feed

De asemenea utilizatorul are posibilitatea de a șterge postările pe care nu le mai dorește pe pagina
personală. În dreptul fiecăreu postări există un ” X ” care execută ștergerea din baza de date a tuplului
corespunzător. Această operație este ireversibilă, iar utilizatorul nu poate recăpăta postările șterse . Se
recomandă introducerea unei ferestre pentru confirmarea acestei operații.
Pentru varianta nesecurizată a aplicației se verifică daca postarea conține text, iar dacă aceast a
conține se verifică tipul postării (privat sau public) și se face inserarea. Numele de utilizator transmis în
tabela posts este username -ul cu care este conectat clientul .

Figura 4.15 Inserare postare în baza de date

Această variantă nu este numai nesigură ci este și generatoare de erori atunci când se încearcă
introducerea unui text conținând apostof. Pentru a securiza postarea mesajelor vom folosi declarații le
pregătite.

Figura 4.16 Inserare postare în baza de date folosind declarații pregătite

38
Afișarea postărilor se face în ordine descrescătoare în funcție de timpul la care s -a făcut postarea .
La momentul postării unui mesaj se preia automat data și ora curentă a serverului bazei d e date folosind
funcția CURRENT_TIMESTAMP din SQL.
Afișarea pe pagina Public se face î n funcție de conținutul coloanei viewz din tabela posts ; se vor
afișa doar postările publice ale tuturor utilizatorilor . Același lucru se întâmplă și la vizitarea profilului
altui utilizator; se pot vizualiza doar mesajele publice. Pe profilul personal clientul va vedea tot
conținutul, fie el public sau privat.

Figura 4.17 Pagina Public
În teorie folosirea declarațiilor pregatite doar pentru porțiunile care preiau date de la utilizator
este suficientă pentru blocarea atacurilor de tip SQL Injection , dar pentru a fi siguri că nu trec
neintenț ionat cu vederea anumite scenarii și să lase loc unei vulnerabilități , dezvoltatorii aleg să
securizeze toate interogările către baza de date.
Pagina Profile , personală fiecăruia din utilizatori , oferă posibilitatea încărcării unei folografii de
profil sau a unui avatar. Limitările acestei funcționalități obligă utilizatorul la încărcarea unui avatar
având extensia .jpg, .jpeg sau .png având o dimensiune de 200×200 pixeli și nu mai mult de 2MB.

Figura 4.18 Încărcare avatar personal

39
Utilizatorul intra pe un site sau f olosește o aplicați e de redimensionare a fotografiilor pe ntru a
creea un avatar având înălțimea și lățimea de exact 200 pixeli după care o salvează. Deschide aplicația
noastră, intră pe profilul pe rsonal, apasă butonul Browse , și caută în computerul personal imaginea creată
mai devreme. Dupa ce o selectează și apasă upload , aplicația dă un refresh automat al paginii și va apărea
imaginea aleasă în locul celei implicite.
Această funcțional itate presupune și apariția unor posibile vulnerabilități la SQL Injection prin
numele imaginii. Pentru a ne proteja de acest tip de atac putem filtra numele imaginii sau se poate face
o redenumire în momentul încărcării în baza de date unde se stochează calea către fișier .
De asemenea un atacator poate încărca un fișier malițios care să infecteze serverul sau baza de
date. Pentru a împiedica acest tip de atac am introdus verificarea extensiei fișierului pentru a permite
doar încărcarea imaginilor.
În dreptul avatarului găsim informațiile despre utilizator. Indiferent că ne aflăm pe pagina noastră
personală sau pe pagina personală a altui utilizator avem permisiunea de a vedea informațiile.
Atunci când ne aflăm pe pagina personală a alt ui utilizator observăm prezența text box -ului pentru
postare. Dacă introducem un mesaj și apăsăm butonul POST postarea se va face pe pagina personală, nu
pe cea a utilizatorului pe care il vizităm.
Pagina Contact este disponibilă atât vizitatorilor cât și utilizatorilor înregistrați. Reprezintă
modalitatea prin care clienții pot contacta administratorul siteului pent ru a oferi sugestii cu privire la
aplicație sau a semnala nereguli.
La apăsarea butonului Send mesajul e trimis la adresa de email cosmin@kali.com . Înainte de
trimiterea emailului utilizatorul sau viziatorul trebuie să completeze câmpurile obligatorii.

Figura 4.19 Pagina Contact

40
Dear Diary este o aplicație unde autentificarea și autorizarea accesului se face pe baza unui
username și a unei parole. Problema cu acest tip de securitate este că datele transmise între client
(browser) și server nu sunt prot ejate și pot fi interceptate. O altă problemă este că utilizatorul nu are nici
o modalitate de a stabili dacă serverul WEB este cel corect.
Rezolvarea acestei probleme o reprezintă Protocolul SSL . Acest protocol asigură un canal de
comunicații sigur între utilizator și serve rul WEB. Pentru a asigura clienții că serverul la care se
conectează este cel corect se folosesc certificate SSL semnate digital. [26]
Protocolul SSL folosește doua tipuri de criptare:
– simetrică : se folosește aceeași cheie pentru criptare și decriptare . Este utilă în criptarea
cantităților mari d e date deoarece este mai rapidă.
– asimetrică : utilizează o pereche de chei diferite ( o cheie publică folosită pentru criptare și o
cheie privată folosită la decriptare ; cele două chei se pot utiliza și vice -versa )
Pentru utilizarea acestui protocol serverul are nevoie de un certificat SSL de la autoritatea care se
ocupă cu furnizarea acestui serviciu . Browserul verifică automat aceste certifica te și se mnalează
utilizatorul în cazul in care validarea eșuează.
Certificatele SSL conțin cheia publică din setul de chei asimetrice. Cu această cheie publică se
codifică cheia sesiunii și se transmite serverului care o decodifică folosind cheia sa privată. După
stabilirea conexiunii sesiunea de comunicații între server și client este c riptată și dec riptată folosind cheia
sesiunii.
SSL previne atacurile de tipul man in the middle (interpunerea atacatorului între client și server
și ascultarea traficului ) deoarece traficul care ar ajunge la hacker este criptat .
Site-urile care posedă certificat SSL sunt accesate folosind prefixul HTTP S. Acestea conțin în
bara de adrese un lacăt verde care identifică conexiunea ca fiind sigură .

Figura 4. 20 Bara de adrese a unui site care foloseste SSL

41
5. Prezentare a instrumente lor folosite în testare
Sqlmap
Sqlmap este o unealt ă gratuită și open source care automatizează procesul de detecție și exploatare
a vulnerabilităților la SQL Injection. Un mare avantaj al acestui tool este faptul că este independent de
platformă și poate deci rula pe Linux, Unix , Windows sau chiar Mac . În distribuția de Linux Kali vine
preinstalat și poate fi folosit imediat după instalarea sistemului de operare . Sqlmap vine pe lângă un
mecanism puternic de detecție și cu o serie de caracteristici care îl transformă unul din cele mai folosite
unelte pentru analiza aplicațiilor WEB. [28]
Pentru rularea pe Linux Kali a aplicației se folosește comanda sqlmap -h, iar pentru Ubuntu,
după instalarea pachetelor pentru limbajul Python, se schimbă folderul de lucru cu cel al sqlmap apoi se
rulează comanda python sqlmap.py -h . Această comandă va deschide meniul de ajutor conținând
o listă cu restul comenzilor și rezulta tul utilizării acestora.
Pentru aflarea bazelor de date de pe un server care deservește un site vulnerabil se folosește
comanda: sqlmap –u “url_site_vulnerabil ” –dbs. Dacă în timpul rulării comenzii apare
eroarea [CRITICAL] unable to retrieve the database names se poate încerca adăugarea
comenzii –no-cast pentru micșorarea lungimii sarcinilor și obținerea numelor bazelor de date.
Numele tabelelor se pot afla prin folosirea opțiunii –tables și a numelui bazei de date.
sqlmap –u “url_site_vulnerabil” –D nume_baza_de_date –tables
După aflarea numelor tabelelor se află numele coloanelor folosind:
sqlmap –u “url_site_vulnerabil” –D nume_baza_de_date –T nume_tabel –columns
Faza finală, aflarea conținutului tabelei , presupune rularea comenzii:
sqlmap –u “url_site_vulnerabil” –D nume_baza_de_date –T nume_tabel –C
nume_coloane –dump
După aflarea conț inutului, sqlmap verifică automat valorile din tabel și dacă se identifică date
posibil obținute prin hash atunci o să se încerce decriptarea acestora.

OWASP Zap
Zap este o unealtă de securitate gratuită și open source menținută sub tutela OWASP, dar la
dezvoltarea căreia participă sute de voluntari. Această aplicație este un tool care automatizează procesul
de descoperire a vulnerabilităților și a problemelor de securitate. [29]
La bază, Zap este de fapt un ”interceptor ”. Se situeaz ă între browserul testerului și aplicaț ia WEB,
captează traficul dintre acestea , modifică pachetele și le trimite mai departe către destinație . Astfel, Zap
poate fi folosit pentru atacuri de tip “man in the middle” sau poate fi o aplica ție de sine stătătoare, fiind
apreciat de începători , dar și de profesioniști.

42
Zap vine cu o serie de versiuni pentru instalat care asigură compatibilitatea cu toate sistemele de
operare majore. În Lin ux Kali acesta vine preinstalat și se poare rula folosind comanda: zaproxy.
Spre deosebire de alte instrumente asemanătoare acesta dispune de o interfață grafică care îi
asigură plusul de simplitate pe care îl preferă începătorii. De asemenea este ușor de instalat și dispune de
o documentație consistentă .
Înainte de a folosi acest tool trebuie să configurăm bro wser-ul pentru a folosi Zap ca proxy.
Implicit acesta folosește:
Adresa: localhost
Portul: 8080
Zap este un proxy amplasat între browser și aplicația WEB așa că folosirea SSL -ului va provoca
o eroare în validarea certificatului și terminarea conexiunii deoarece acest instrument criptează și
decriptează traficul folosind certificatul original al aplicației.
Pentru a preveni terminarea conexiunii în acest mod, Zap creează automat un certificat SSL
pentru fiecare server accesat folosind autoritatea proprie de eliberare a certificatelor.
După configurarea browser -ului pentru folosirea Zap ca și proxy, ne putem conecta la aplicația
care urmează a fi testată.
Cea mai simplă cale pentru a rula un test Zap este Quick Start Test. Se introduce link-ul de acces
la aplicație în spațiul pentru URL și se apasă Attack .
Rezultatele constau într -o hartă a siteului cu paginile vizitate și o listă cu alerte separate în
categorii de grade de risc.

Skipfish
Skipfish reprezintă un instrument creat de Google ideal pentru dezvoltatorii de aplicații WEB sau
pentru deținătorii unor siteuri pentru a -i ghida în detectarea problemelor de securitate pe care le -ar putea
avea aplicația. [30]
Sistemele de operare suportate sunt Linux, Windows și MacOS X . Pe Linux Kali acesta vine
preinstalat și se poate rula din terminal folosind comanda:
skipfish –url=”http://ip_site”
Modul de funcționare al acestui tool se bazează pe crearea unei hărți interactive a siteului, după
care se rulează o varietate de teste asupra acesteia.
La finalul scanării se produce generarea unei pagini WEB de vizualizare a rezultatelor.
Skipfish a fost dezvoltat în limbajul de programare C ceea ce îi conferă o viteză superioară altor
instrumente asemănatoare. Un alt avantaj important este posibilitatea întreruperii scanării în or ice
moment și obținerea unor rezultate parțiale.

43
6. Testarea aplicației nesecurizate
Deoarece SQL Injection este una din cele mai comune probleme ale aplicațiilor WEB vom începe
testarea Dear Diary cu aceasta. Principiul pe care se bazează acest tip de atac este inserarea unei secvențe
SQL într-o intrare a siteului pentru a determina execu ția anumitor operații a supra bazei de date. În
anumite c ircumstanțe un hacker poate chiar afla conținutul întregii baze de date.
Testarea manuală reprezită pentru majoritatea atacatorilor sau testărilor o tehnică ineficientă și
consumatoare de timp pentru testarea aplicației, dar este recomandată pentru începători datorită câștigării
unui grad de întelegere mai bun al funcționării și configurării instrumentelor automate pentru testare.
Un prim test pentru identificarea unui site vulnerabil la SQL Injection este adăugarea î n bara de
adrese a browserului a unui apostr of la sfârșitul URL -urilor de forma http://site.xyz/index.php?id=1 .
Un URL cu structură asemănătoare se găsește și pe pagina Profile a aplicației noastre:

Figura 6.1 URL posibil vulnerabil la SQL Injection

După introducerea apostrofului în URL am primit eroarea: Warning: mysqli_fetch_array()
expects parameter 1 to be mysqli_result, boolean given in /var/www/html/profile.php on line 100 ceea
ce indic ă că pagina e vulnerabilă și putem continua testarea aplicaț iei .
Înainte de a afla mai multe informații despre baza de date avem nevoie de numărul de coloane.
Pentru a face asta vom adăuga URL -ului structura order by 1 –. Se incrementează acel număr până la
primirea unei erori. Caracterele “ – “ transformă tot ce urmează după ele în comentarii.
Pentru Dear Diary primim eroarea Unknown column ‘8’ in ‘order clause’ ceea ce semnifică că
tabela noastră are 7 coloane și putem trece la verificarea funcției UNION (funcție ce combină rezultatul
mai multor select -uri) ce ne va fi de ajutor î n selectarea mai multor informații din baza de date în
aceeași declarație.
Vom folosi urmatoarea construcție pentru a vedea care din coloane afișează un rezultat :
http://localhost/profile.php?user= -COSMIN union all select 1,2,3,4,5,6,7 –
Observăm apariția numărului 3 pe ecran deci coloana 3 este utilizată pentru a face afișări pe
pagină și ne putem folosi de asta și de tabelul de funcții pentru a afl a informațiile dorite din baza de
date a aplicației.

44

Figura 6.2 Funcții utilizate în realizarea injectării manuale [31]

Pentru a ob ține numele bazei de date:
http://localhost/profile.php?user= -COSMIN union all select
1,2,database() ,4,5,6,7 –
După rularea comenzii aflăm că numele bazei de date este “ddbase” și putem incepe extragerea
numelor tabelelor.
http://localhost/profile.php?user= -COSMIN union select
1,2,table_name, 4,5,6,7 from information_schema.tables where
table_schema=database() –
Aflăm de existența a două tabele: users și posts. Avem nevoie doar de con ținutul tabelei users așa
ca vom rula codul pentru aflarea numelor coloanelor doar pentru ea.
http://localhost/profile.php?user= -COSMIN union select
1,2,column_name, 4,5,6,7 from information_schema. columns where
table_schema=database() and table_name=”users ”–
Urmează ultimul pas și anum e extragerea datelor din tabela. Dorim doar username -ul și parola
deoarece re stul informațiilor sunt publice, așa că vom extrage doar acele coloane.
http://localhost/profile.php?user= -COSMIN union select 3,4 from users
După extragerea datelor din tabel vom avea două coloane: una cu username -uri și cealaltă cu
parolele corespunzătoare. Alegem de exemplu rândul cu numele de utilizator COSMIN.

45
Pentru decriptarea parolei care îi corespunde avem nevoie în primul rând să cunoaștem funcția
cu care s -a realizat hash -ul. Pentru aceasta folosim o une altă preinstalată în Linux Kali: hash-identifier.

Figura 6.3 Rezultat has h-identifier

După rularea hash -identifier am aflat că s -a folosit funcția MD5 pentru a face criptarea parolei.
Pentru decriptarea acesteia vom utiliza un alt utilitar prezent în Linux Kali și anume findmyhash .

Figura 6.4 Decriptare parolă

Figura 6.5 Rezultat decriptare parolă

În urma rulării utilitarului folosit pentru decriptare am aflat parola pentru utilizatorul COSMIN.
Parola este cosmin. Se procedează similar și pentru restul intrărilor din tabelă.
Remarcăm greșeala clientulu i de a folosi aceeași pa rolă ca și numele d e utilizator. O măsură de
securitate suplimentară pe care o poate lua dezvoltatorul este de a impune folosirea unei parole diferite
de numele de utilizator la înregistrarea unui cont nou pentru utilizatorii care ignoră riscurile .
O parolă puternică ar trebui să conțină minim 10 caractere, să includă numere, simbol uri, litere
mici și litere mari.
Exemplu parolă slabă : 123456

46
Exemplu parolă puternică : C12ax$ro B5
Pentru urmatorul set de teste a vulnerabilității am ales folosirea unei surse externe. Pentru
accesarea aplicației de la distanță vom folosi port forwa rding .
Port forward este modalitatea prin care un computer/server poate fi accesat de la distanță de alte
calculatoare din alte rețele. Pentru a configura port forward am realizat următorii paș i:
– logarea pe router folosind IP-ul 192.168.0.1
– selectare a opțiunii forwarding din meniu
– completare cu datele din figură
– salvare

Figura 6.6 Configurare port forward

După configurarea port forward pentru a accesa aplicația avem nevoie de IP -ul computerului
folosit pentru găzduire. Acesta se poate afla folosind comanda ifconfig în terminal. Acum putem accesa
aplicația introducând în browser IP-ul găsit.
Deschiderea unui port implică și ris curi, dar dacă serverul are un firewall bine pus la punct acesta
va bloca toate tentativele de atac. Pentru vizualizarea porturilor deschise putem folosi nmap.
O alt ă posibilă vulnerabilitate la SQL Injection se află în formularul de logare. Pentru a testa
această vulnerabilitate intrăm pe pagina Public a aplicației noastre luăm un nume de utilizator la
întâmplare și ne întoarcem la formularul de logare.
Numele de utilizator ales este ANDREEA. Acesta îl vom trece în formular în câmpul userna me,
iar la parolă vom scrie ’ OR ’1’ = ’1 .

Figura 6.7 Logare abuzivă

Interogarea di n formularul de logare :
SELECT * from users where username=’$username’ AND password=’ $password’;

47
După înlocuirea în interogarea din formular a username -ului ales și a parolei obținem:
SELECT * from users where username='ANDREEA' AND password = ’ ’ OR ’1’ = ’1’ ;
Aceasta sintagmă este adevarată și va determina logarea în contul de utilizator ANDREEA.

Figura 6.7 Logare reușită abuzând de vulnerabilități

Acum putem intra pe pagina Profile și citi postările private sau șterge postările utilizatorului
ANDREEA . Se procedează similar pentru a ne conecta în contul altor utilizatori ce apar pe p agina
publică .
O altă vulnerabilitate prezentă este accesarea URL -ului http://localhost/profile.php
de către vizitatori.

Figura 6.8 Pagina Profile accesată abuziv

Un atacatot poate profita de această vulnerabilitate pentru a umple baza de date cu informații
inutile sau pentru lansarea atacurilor de tip DDoS prin suprasolicitarea conexiunii cu lansarea de
interogări multiple folosind formularul de postare.
Injectarea manuală necesită un efort susținut din partea atacatorului și nu este garantat succesul
găsirii unei vulnerabilități. Din fericire există numeroase instrumente de injectare automată a codului
SQL care care îmbunătățesc extrem de mult posibilitatea succesului în privința atacului.
Testarea aplicației pentru găsirea vulnerabilităților la SQL I njection implică 2 etape [27]:
– scanarea pentru găsirea vulnerabilităților (căutarea intrărilor din aplicație care pot fi exploatate
sau alte ”găuri” specifice . Exemple : Acunetix, Arachni, Grabber )
– SQL Injection propriu -zis ( după identificarea vulnerabilităților începe exploatarea lor )

48
Cea mai folosită unealtă automată este sqlmap. Pentru a scana vulnerabilitățile introducem
urmatoarea comandă care va returna bazele de date de pe server :
sqlmap –u ”http://localhost/profile.php?user=COSMIN“ –dbs –no-cast

Figura 6.9 Sqlmap – listă baze de date

De asemenea se poate obține și o listă a utilizatorilor care gestionează baza de date:
sqlmap –u ”http://localhost/profile.php?user=COSMIN“ –users –no-cast

Figura 6.10 Sqlmap – listă utilizatori

49
Baza de date de interes pentru noi este ddbase asupra căreia vom rula următoarea comandă :
sqlmap –u ”http://localhost/profile.php?user=COSMIN“ -D ddbase –tables

Figura 6.11 Sqlmap – listă tabele

Vom începe analiza tabelelor cu tabela users deoarece presupunem ca ace asta conține conturile
de utilizator datorită numelui ales pentru tabelă .
sqlmap –u ”http://localhost/profile.php?user=COSMIN“ -D ddbase -T users –
columns

Figura 6.12 Sqlmap – descriere tabel a users

Pasul final constă în afișarea numelui de utilizator , a parolei și a emailului .
sqlmap –u ”http://localhost/profile.php?user=COSMIN“ -D ddbase -T users -C
username,password –dump

Figura 6.13 Sqlmap afișare conținut tabelă

50
Pentru decriptarea parolei se poate folosi hash -identifier pentru a descoperi funcția cu care s -a
făcut hashul parolei și findmyhash pentru decriptarea propriu -zisă.
OWASP Z ap reprezintă un instrument automat de analiză a vulnerabilităților privind siguranța
aplicațiilor WEB. Rularea acestuia se face folosind comanda zaproxy în terminal care determină
pornirea interfeței grafice a aplicației.
Pentru lansarea unui test mergem la Quick Start Test și introducem adresa aplicației în spațiul
pentru URL.

Figura 6.14 Rezultat OWASP Zap

În urma scanării a rezultat o serie de alerte având un grad diferit de risc, cea mai importantă fiind
vulnerabilitatea la SQL Injection. Celelalte alerte, încadrate ca fiind minore presupun atacuri asupra
cookie ( neimportante pentru noi deoarece am folosit sesiuni ) , vulnerabilitate la atacurile de tip XSS și
prezența posibilității completării automate a numelui de utilizator și parolei .
Funcționarea OWASP Zap a dezvăluit o altă vulnerabilitate importantă a a plicației: posiblilitatea
creării unui număr foarte mare de conturi de pe același IP. În urma rulării Zap s -a produs o umplere a
bazei de date cu conturi create automat folosind formul arul de înregistrare.

51

Figura 6.15 Conturi create automat OWASP Zap

O altă unealtă pentru scanarea vulnerabilităților pe care o vom folosi este skipfish . Pentru lansarea
testului vom folosi comanda:
skipfish –o rezultat http://188.27.192.131
În timpul scanării skipfish abuzează de vulnerabilitatea posibilității accesului la pagina Profile
deși nu suntem logați și produce o încărcare a tabelei posts cu spam.

Figura 6.16 Tabela posts după scanarea cu skipfish

De asemenea se creează automat o pagină WEB conținând recultatele testării. Această pagină se
găsește în folderul rezultat care s -a creat la rularea comenzii de testare.

6.17 Rezultat rulare skipfish aplicație nesecurizată

Observăm prezenț a unor atenționări cu risc maxim (bulina roșie) care necesită atenția imediată a
dezvoltatorului. Acestea reprezintă vulnerabilitățile aplicației nesecurizate la SQL Injection.

52
7. Testarea aplicației securizate
După desc operirea unei multitudini de vulnerabilități î n securitatea aplicației Dear Diary s-a
luat măsura aplicării declarațiilor pregătite pentru interogările care lucrează cu date de intrare de la
utilizatori pentru protejarea împotriva injectării de cod SQL .
Similar testării aplicației vulnerabile vom începe cu o testare manuală a site ului. La adăugarea
apostrofului în URL -ul browserului sunt em redirecționați catre o pagină de eroare care oferă
posibilitatea întoarcerii la pagina anterioară.

Figura 7.1 Pagina de eroare

De asemenea am eliminat posibilitatea accesării paginii Profile de către clienții care nu sunt logați
în contul de utilizator . Încercarea de a accesa această pagină va redirecționa clientul cătr e pagina de
eroare.
Securizarea formularului de logare s -a produs prin folosrea declarațiilor pregătite. Orice încercare
de a scrie altceva în formular în afara username -ului și parolei corecte provoacă apariția erorii care anunță
clientul că username -ul sau parola sunt greșite. Tentativele de injectare manuală asupra formularului a
eșuat.
Testarea aplicației nesecurizate a produs o umplere a tabelei users cu conturi automate create de
OWASP Zap . Pentru a combate această vulnerabilitate avem două soluții:
– filtrarea pe IP ( nu se poate crea mai mult de un cont de utilizator de pe același IP )
– introducerea unui captcha în formularul de înregistrare
Captcha este o metodă automată prin care se poate determina dacă utilizatorul unei aplicații este
o persoana sau un script. Cele mai pu ternice captcha sunt determinate de distorsiunea unui text într-o
imagine.

53
Pentru simplitate am ales introducerea unui captcha î n formularul de înregistrare care să ateste
identitatea unui utilizator. Crearea acestuia constă în generare a unui text la întâmplare contituit din 6
caractere: cifre, litere mari și litere mici .

Figura 7.2 Apelarea funcț iei de generare captcha

Figura 7.3 Func ția de generare captcha

Figura 7.4 Formular înregistrare aplicație sigură

Pentru a elimina acțiunea unora din instrumentele de recunoaștere a caractarelor am introdus o
regulă în codul CSS al paginii care taie textul.
text-decoration: line-through;

54
Această modificare a formularului de înregistrare a blocat Zap din a crea conturi automate.
După rularea OWASP Zap pe aplicația considerată sigură rezultă o serie de alerte considerate
minore și între care nu se numără vulnerabilitatea la SQL Injection.
De asemenea am eliminat completarea automată a numelui de utilizator și a parolei considerată
problemă de securitate: autocomplete = “off” .

Figura 7.5 Rezultat OWASP Zap aplica ție sigură

Testarea aplicației folosind sqlmap are ca finalitate imposibilitatea aplicației de a găsi vreo
vulnerabilitate la SQL Injection

Figura 7.6 Rezultat sqlmap aplicație sigură

Rezistența aplicației la vulnerabilitățile de tip SQL Injection este confirmată și de instrumentul
skipfish . Atenționările de risc maxim au dispărut, iar cele cu risc mediu s -au înjumătățit.

Figura 7.7 Rezultat skipfish aplicație sigură

55
8. Concluzii
Dear Diary este o aplica ție creată în totalita te de mine având în minte ideea dezvoltării unei
aplicații WEB care să înlocuiască jurnalul clasic și care să aducă aminte de o rețea socială.
Avantajele pe care le oferă față de varianta clasică sunt: mobilitatea sporită, accesul jurnalului la
distanță, securitate maximă, posibilitatea publicării unora din scrieri , posibilitatea citirii publicațiilor altor
utilizatori.
Aplicația rulează pe o distribuție de Linux Kali pe care am instalat -o în paralel cu Windows 10 și
folosește o baza de date open source, MariaDB. Pentru testarea aplicației, datorită incompatibilității
unora din instrumentele de analiză cu URL -ul conținând localhost , s-a decis instalarea unei mașini
virtuale cu Ub untu și realizarea port forward . Conectarea la aplicație s -a făcut folosind IP-ul extern al
sistemului introdus în browser.
Pentru securizarea aplicației aveam nevoie să cunoașem în primul rând problemele. Pentru
detectarea vulnerabilităților am folosit atât testarea manuală, cât și automată folosind instrumentele:
sqlmap, skipfish și OWASP Zap.
În demonstrațiile vulnerabilităților aplicați ei slab securizate am folosit MariaDB 5.5 care este o
versiune mai veche ș i este mult mai ușor de exploatat. Odată cu securizarea aplicației am reali zat și un
update al sistemului de operare care a instalat ultima versiune de MariaDB la momentul actual , 10.2 .
Aceasta prezintă noi caracteristici care o fac mai stabilă și mai sigură.
Pe parcursul implementării aplicației Dear Diary am realizat o serie de observații care ar servi
drept model unui dezvoltator aflat la început:
– cu cât aplicația prezintă mai multe intrări cu atât creste riscul de a avea vulnerabilități în aplicație
deoarece dezvoltatorul poate trece neintenționat una din ele cu vederea atunci când realizează securizarea
site-ului
– este recomandată folosirea unor parole puternice atunci când se realizează înregistrarea unui cont de
utilizator. Ideal aceasta ar trebui să aibă minim 12 caractere, să conțină litere mici, litere mari, numere și
simboluri și să nu fie reprezentată de cuvinte din dicționar
– o bună practică este existența celei de -a doua baze de date a sistemului folosită pentru backup în
condițiile in care un atacator ar reuși să spargă baza de date și să modifice sau chiar să șteargă conținutul
acesteia
– la crearea formularului de logare / înregistrare se va f olosi atributul autocomplete = “off“ care
înlătură sugestiile de completare
– pentru realizarea interogărilor în baza de date care implică date de intrate de la utilizatori se vor folosi
declarații pregătite pentru securizarea împotriva SQL Injection
– trebuie sa se as igure integritate a fizică a serverului și un alt server de backup
– realizarea update -urilor periodice oferite de dezvoltatori sistemului și ale bazei de date

56

57
9. Bibliografie
[1] Prof. Felicia I onescu , Curs de prelucrare a bazelor de date
[2] Modelul de date relațional ,
http://contabilitatesiinformaticadegestiune.blogspot.ro/2011/11/modelul -de-date-relational.html ,
accesat la data: 23. 05.2017
[3] Server Web , https://ro.wikipedia.org/wiki/Server_web , accesat la data: 28.05.2017
[4] Sonia Jahid and Imranul Hoque , Security issues of Web Server ,
https://www.academia.edu/472431/SECURITY_ISSUES_OF_WEB_SERVER ,
accesat la data: 29 .05.2017
[5] Diana Bărbat, Securitatea bazelor de date – Atacuri și metode de control ,
http://asociatia -profesorilor.ro/securitatea -bazelor -de-date-atacuri -si-metode -de-control.html
accesat la data: 01.06.2017
[6] Michael Mimoso, Top Web application security problems identified ,
http://searchsecurity.techtarget.com/news/873823/Top -Web -application -security -problems -identified
accesat la data: 28.05.2017
[7] Ghid de securizare a aplicațiilor WEB ,
https://www.cert.ro/vezi/document/ghid -securizare -aplicatii -web
accesat la data: 05.06.2017
[8] Kali Linux , https://en.wikipedia.org/wiki/Kali_Linux , accesat la data: 08.06.2017
[9] Apache HTTP Server , http://clubtech.ro/viewtopic.php?t=1746, accesat la data: 08.06.2017
[10] MariaDB vs MySQL , http://www.iulianhalac.com/adio -mysql -a-ajuns -la-sfarsit/
[11] Moving to MariaDB , https://mariadb.com/kb/en/mariadb/moving -to-mariadb/
[12] PHP , https://ro.wikipedia.org/wiki/PHP , accesat la data: 09.06.2017
[13] HTML , https://ro.wikipedia.org/wiki/HyperText_Markup_Language, accesat la data de
09.06.2017
[14] CSS, https://en.wikipedia.org/wiki/Cascading_Style_Sheets , accesat la data de 09.06.2017
[15] Thomas Cannolly and Carolyn Begg, Database Systems – A practical app roach to Design,
Implementation, and Management , Fourth Edition, pp 113
[16] Limbajul SQL , http://www.runceanu.ro/adrian/wp -content/cursuri/bd2013/C9 -BD.pdf ,
accesat la data de 13.06.2017
[17] Linux , https://ro.wikipedia.org/wiki/Linux , accesat la data de 12.06.2017
[18] Linux , http://vega.unitbv.ro/~jipa/ui/linux/comp_login.html , accesat la data de 12.06.2017
[19] Figura 3.1 , http://vega.unitbv.ro/~jipa/ui/img/compon.jpg
[20] Linux , https://www.tutorialspoint.com/operating_system/os_linux.htm ,
accesat la data de 12.06.2017
[21] Sqlmap , http://tools.kali.org/vulnerability -analysis/sqlmap, accesat la data de 1 2.06.2017
[22] Nmap , https://ro.wikipedia.org/wiki/Nmap , accesat la data de 18.06.2017
[23] Arhitectura Client Server , https://ro.scribd.com/doc/43124974/Arhitectura -Client -Server , accesat
la data de 13.06.2017
[24] Unified Modeling Language , https://ro.wikipedia.org/wiki/Unified_Modeling_Language , accesat
la data de 14.06.2017

58
[25] UML diagram types , http://creately.com/blog/diag rams/uml -diagram -types -examples , accesat la
data de 14.06.2017
[26] Ce este SSL?, https://www.domreg.ro/ce -este-ssl.shtml, accesat la data de 18.06.2017
[27] SQL Injection tools for automated tests , http://searchsqlserver.techtarget.com/tip/SQL -injection –
tools -for-automated -testing , accesat la data de 19.06.2017
[28] Sqlmap , https://github.com/sqlmapproject/sqlmap/wiki/FAQ , accesat la data de 24.06,2017
[29] OWASP ZAP 2.6 Getting Started Guide ,
https://github.com/zaproxy/zaproxy/releases/download/2.6.0/ZAPGettingStartedGuide -2.6.pdf
[30] Skipfish Documentation , https://code.google.com/archive/p/skipfish/wikis/SkipfishDoc.wiki ,
accesat la data de 27.06.2017
[31] Figura 6.2, http://securityidiots. com/Web -Pentest/SQL -Injection/Basic -Union -Based -SQL –
Injection.html

59
Anexa 1
index.php navbar1.php
<?php
session_start();
require_once("dbconnect.php");
?>

<html>
<head>
<link rel="stylesheet" type="text/css" href="index.css">
</head>
<body>
<?php
if($_SESSION['logged'] == true){
include("navbar2.php"); }
else {
include("navbar1.php"); }
?>

<img class = "banner" src="Images/bannerx3.png"
alt="banner">

<?php
if($_SESSION['logged'] == true){
echo '
<div class = "top_band2"></div>
<nav>
<ul>
<li class = "current -item"><a href = "public.php">
PUBLIC </a></li>
<li><a href = "profile.php">PROFILE</a></li>
<li><a href = "contact.php">CONTACT</a></li>
</ul>
</nav>';
}
else {
echo '
<div class = "top_band2"></div>
<nav>
<ul>
<li class = "current -item"><a href = "index.php">
HOME </a></li>
<li><a href = "public.php"> PUBLIC </a></li>
<li><a href = "contact.php">CONTACT</a></li>
</ul>
</nav>';
}
?>

<div class = "body">
<br><h1 style = "font -family:Times New Roman">
Welcome </h1>
<p class = "welcome"> Wellcome message </p>
</div>

<?php include("footer.php");?>
<div class = "top_band"></div>
<div class = "top_x">
<form ac tion="login.php" method="post">
<input class="input_form_login_top" type="text" id="login_username"
placeholder="username" name="login_usernam e" autocomplete="off" required>
<input class="input_form_login_top" type="password" id="login_password"
placeholder="password" name="login_password" autocomplete="off" required>
<but ton type="submit" name="submit" class = "button_login_top"> Login </button>
<button onclick="document.getElementById('idx').style.display='block'"
style="width:auto;" class="button_signup_top"> Sign Up</button>
</form></div>

<div id="idx" class="modal">
<form class="modal -content animate" action="register.php" method="post">
<div class="imgcontainer">
<span onclick="document.getElementById('idx').style.display='none'"
class="close" title="Close Modal">&times;</span>
<img src="Images/logo.png" wi dth = "80px" height = "80px" alt="logo">
</div>

<div class="container">
<label for="name">Name:</label></br>
<input class="form_signup" type="text" id="register_name"
name="register_name" autocomplete="off" required> </br>
<label for="username">Use rname:</label></br>
<input class="form_signup" type="text" id="register_username" pattern=".{3,10}"
autocomplete="off" title="Username must have 3 -10 characters."
name="register_username"required></br>
<label for="mail">Email:</label></br>
<input class="form_signup" type="email" id="register_email"
name="register_ema il" autocomplete="off" required>< /br>
<label for="password">Password:</label></br>
<input class="form_signup" type="password" id="register_password"
pattern=".{6,}" autocomplete=" off" title="Minimum 6 characters"
name="register_password" required></br>
<label>Sex</label></br>
<input type="radio" id="register_gender" name="register_gender" value="male" >
Male<br>
<input type="radio" id="register_gender" name="register_gender"
value="female"> Female<br></br>
<label> <center> Introduce the text (Captcha)</center></label>
<?php $_SESSION['captcha']= randomCaptcha();
echo '<p class="captcha_p" > $_SESSION['captcha'] </p>'; ?>
<input class ="captcha" type="text" id="captcha" name="captcha"
autocomplete="off" required> </br></br>
<button type="submit" class = "button_signup_form">Sign Up</button></br>
</div>

<div class="container" style="background -color:#f1f1f1">
<button type="button"
onclick="document.getElementById('idx').style.display='none'"
class="cancelbtn">Cancel</button>
</div> </form></div>

<?php

60
<script>
var modal = document.getElementById('idx');
window.onclick = function(event) {
if (event.target == modal) {
modal.style.display = "none"; }
}
</script>
</body>
</html> function randomCaptcha($length = 6) {
$char s = '0123456789abcdefghijklmnopstuvwxyzABCDEF GHIJKLMNOP QRTUVWXYZ';
$rS = '';
for ($i = 0; $i < $length; $i++) {
$rS.= $chars[rand(0, strlen($chars) – 1)];
}
return $rS;
}
?>
navbar2 .php mail .php

61
<div class = "top_band"></div>
<div class = "top_x">
<form class = "navbar2_form" action="/logout.php" method="post">
<a href='../profile.php?user=<?php echo $username; ?>'>
<?php
$db = mysqli_connect("localhost","stringdot","Ninja123","ddbase");
$sql = "SELECT avatar FROM users WHERE username = '$username'";
$result = mysqli_query($db,$sql);
while($row = mysqli_fetch_array($result)){
echo'<img class = "avatar_top" src="/uploads/'.$row['avatar'].'"
width="24" height="24">'; }
?></a>
<?php
$usr = $_SESSION['login_username'];
$usr = strtoupper($usr);
echo "<span style= \"color:white;font -size: 10pt; font -family:Arial;
vertical -align: 7px; \"> &nbsp;&nbsp;$usr </span>";?>
<button type="submit" name="submit" class = "button_logout_top">
Log Out </button>
</form>
</div>
<?php
session_start();
$namex = $_POST['name'];
$emailx = $_POST['email'];
$phone = $_POST['phone'];
$address= $_POST['address'];
$subject = $_POST['subject'];
$message = $_POST['message'];
$formcontent=" From: $namex \n Message: $message \n
Phone:$phone \n Address: $address \n\n\n ";
$destination = "cosmin@ka li.com";
$mailheader = "From: $emailx \r\n";
mail($destination, $subject, $formcontent, $mailheader) or
die("Error!");
echo "Thank You!" . " -" . "<a href='../public.php' style='text –
decoration:none;color:#ff0099;'> Return Home</a>";
?>
post.php

<?php
session_start();
require_once("dbconnect.php");

if ($_POST['postare'] != '' ) {
$postare = $_POST['postare'];
if(isset($_POST['isprivate'])){
$isprivate = $_POST['isprivate'];}
else {
$isprivate = 'public';
}
$username = $_SESSION['login_username'];

if($stmt = mysqli_prepare($connect,"INSERT INTO posts
(username,postare,viewz) VALUES (?, ?, ?)")){
mysqli_stmt_bind_param($stmt, "sss", $username, $postare,
$isprivate);
mysqli_stmt_execute($stmt) ;
mysqli_stmt_error($stmt);
$isprivate = NULL;

if ( !mysqli_stmt_error($stmt)){
header("Location: ../profile.php?user=$username");
} else {
echo "EROARE!";
}
mysqli_stmt_close($stmt);
}
}
?>

delete_post.php

<?php
session_start();
$id = $_GET['id_post'];
$user = $_SESSION['login_username'];
$db = mysqli_connect("localhost","stringdot","Ninja123","ddbase");
$sql = "DELETE from posts where id_post = '$id'";
$result = mysqli_query($db,$sql);

if ($result) {
header("Location: ../profile.php?user=$user");
} else { echo "EROARE"; }

?>

footer.php

<footer>
<p class = "footer_text"> COSMIN ISTUDOR &#x00a9; 2017</p>
<div class = "footer_band"></div>
</footer>

error.p hp

<?php session_start() ?>
<html>
<head>
<link rel="stylesheet" type="text/css" href="index.css">
<html>
<body>
<p class="error"> ERROR! Go <a href = "/public.php">BACK</a>!</p>
</body>
</html>
register.php login.php

62
<?php
session_start();
require_once("dbconnect.php");

// verifica daca exista date transmise
if ($_POST['register_name'] != '' && $_POST['register_username'] != ""
&&
$_POST['register_password'] != "" && $_POST['register_email'] != ""
&&
$_POST['register_gender'] != "" && $_POST['captcha']==
$_SESSION['captcha']){

// preia datele din formular
$name = $_POST['register_name'];
$username = $_POST['register_username'];
$username = strtoupper($username);
$password = hash('sha256', $_POST['register_password']);
$email = $_POST['register_email'];
$gender = $_POST['register_gender'];

if($stmt = mysqli_prepare($connect,"INSERT INTO users
(name,username,password,email,gender)
VALUES (?,?,?,?,?)")){
mysqli_stmt_bind_param($stmt, "sssss", $name, $username,
$password, $email, $gender);
mysqli_stmt_execute($stmt);
mysqli_stmt_error($stmt);
// afiseaza un mesaj de succes
if ( !mysqli_stmt_error($stmt)){
echo " Inregistrarea a fost efectuata cu succes.<br>
Click <a href='/index.php'>aici</a> pentru a reveni la pagina de
login";
}
else {
echo "Contul nu a fost creat. Exista deja un cont cu acest username
sau email.</br>";
echo "Cl ick <a href='/index.php'>aici</a> pentru a reveni la pagina
principala";
}
mysqli_stmt_close($stmt);
} }
else{ echo "Bad Captcha! Click <a href='/index.php'>here</a> to try
again.";}
?> <?php
$error='';
if (isset($_POST['submit'])) {
if (empty($_POST['login_username']) ||
empty($_POST['login_password'])) {
$error = "Username or Password is invalid";
} else {
$connect = mysqli_connect("localhost", "stringdot", "Ninja123",
"ddbase") or die( mysqli_error()) ;

$username=$_POST ['login_username'];
$username= strtoupper($username);
$password=$_POST['login_password'];
$password = hash('sha256', $password);

if($stmt = mysqli_prepare($connect,"SELECT * from users where
username=? AND password=?")){

mysqli_stmt_bind_param($stmt, "ss", $username, $password);
mysqli_stmt_execute($stmt);
mysqli_stmt_store_result($stmt);
$rows = mysqli_stmt_num_rows($stmt);
mysqli_stmt_close($stmt);

if ($rows == 1) {
session_start();
$_SESSION['logged'] = true;
$_SESSION['log in_username'] = $username;
header("location: ../public.php ”);
exit();
} else {
$_SESSION['logged']=false;
$error = "Username or Password is invalid </br>";
echo $error;
echo "Click <a href='/index.php'>aici</a> pentru a incerca din
nou";
}
mysqli_close($connect);
}
}
}
?>

dbconnect .php

<?php
$server = "localhost";
$database = "ddbase";
$username = "stringdot";
$password = "Ninja123";
$connect = mysqli_connect($server,$username,$password) or die(
mysqli_error() );
$db = mysqli_select_db($connect,$database) or die(
mysqli_error($connect) );
?> logout.php

<?php
session_start();
unset($_SESSION['login_username'] );
unset($_SESSION['logged'] );
if(session_destroy()) {
header("Location: ../index.php");
}
?>

63
profile.php public.php
<?php
session_start();
$user = $_GET['user'];
$user = strtoupper($user);
$connect = mysqli_connect("localhost", "stringdot", "Ninja123",
"ddbase") or die( mysqli_error()) ;
if($s = mysqli_prepare($connect,"SELECT * from users where
username=? ")){
mysqli_stmt_bind_param($s, "s", $user);
mysqli_stmt_execute($s);
mysqli_stmt_store_result($s);
$rows = mysqli_stmt_num_rows($s);
mysqli_stmt_close($s);
if ($rows == 1) {
$username = $_SESSION['login_username'];
if($_SESSION['logged'] == true){
include("navbar2.php");
echo ' <div class = "top_band2"></div> <nav>
<ul>
<li><a href = "/public.php"> PUBLIC </a></li>
<li class = "current -item"><a hr ef =
"/profile.php?user='.$username.'">PROFILE</a></li>
<li><a href = "/contact.php">CONTACT</a></li>
</ul>
</nav>';
} else { header("Location: ../error.php"); }
?>

<html>
<head>
<link rel="stylesheet" type="text/css" h ref="../index.css">
</head>
<body>
<img class = "banner" src="../Images/bannerx3.png" alt="banner">
<?php
echo '
<div class = "body_postare">
<form class="form_postare" method="POST" action="post.php"><br />
<textarea style = "font -size:14px" name="postare" rows="6" cols="72"
placeholder="How was your day? " required></textarea><br /><br />
<input class="isprivate" type="checkbox" name="isprivate"
value="private"> private <br>
<input class="buton_send_postare" type="submit" name="submit"
value="POST"><br /><br />
</form></div>';

if($user == $_SESSION['login_username']){
echo' <form class = "file_upload_form" action="upload_image.php"
method="POST" enctype="multipart/form -data">
<input type="file" name="image" />
<input type="submit" value ="upload" />
</form>';}
?>
<?php
$db = mysqli_connect("localhost","stringdot","Nin ja123","ddbase");
$sql = "SELECT name, username, email, gender, avatar FROM users
WHERE username = '$user'";
$result = mysqli_query($db,$sql); <?php
session_start();
$username = $_SESSION['login_username'];
if($_SESSION['logged'] == true){
include("navbar2.php");
} else { include("navbar1.php"); }
if($_SESSION['logged'] == true){
echo '
<div class = "top_band2"></div>
<nav> <ul>
<li class = "current -item"><a href = "/public.php"> PUBLIC
</a></li>
<li><a href = "/profile.php?user='.$username.'">PROFILE</a></li>
<li><a href = "/contact.php">CONTACT</a></li>
</ul> </nav>';
} else {
echo '
<div class = "top_band2"></div>
<nav> <ul>
<li><a href = "/index.php"> HOME </a></li>
<li class = "current -item"><a href = "/public.php"> PUBLIC
</a></li>
<li><a href = "/contact.php">CONTACT</a></li>
</ul> </nav>';
}
?>

<html>
<head>
<link rel="stylesheet" type="text/css" href="../index.css">
</head >
<body>
<img class = "banner" src="../Images/bannerx3.png" alt="banner">
<div class = "body_postare"></div>
<?php
$db = mysqli_connect("localhost","stringdot","Ni nja123","ddbase");
$query = "SELECT postare,date_post,username,viewz FROM posts
ORDER BY date_post DESC LIMIT 10";
$result = mysqli_query($db,$query);
$posts = array();
$public = "public";
while($row = mysqli_fetch_array($result)) {
if($row['viewz'] == $public){
echo '<hr class = "baraintrepostari"></br></br></br>';
if($_SESSION['logged'] == true){
echo '<p class = "data_wall_personal">'.$row['date_post'].'&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;
<a href = /profile.php?user='.$row['username'].'">'.$row['username'].'
</a></p>';
} else {
echo '<p class = "data_wall_personal">'.$row['date_post'].'&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp; '.$row['username'].'</p>'; }
$posts[] = $row['postare'];
echo '<p cla ss = "wall_personal">'.$row['postare'].'</p>'; }}
?>
<?php include("footer.php");?>
</body>
</html>

64

while($row = mysqli_fetch_array($result)) {
if($user == $_SESSION['login_username']){
if(empty($row['avatar'])){ echo'<img class = "avatar_p"
src="uploads/NoAvatar.jpg" alt="avatar">';
} else { echo'<img class = "ava tar_p" src="uploads/'.$row['avatar'].'"
alt="avatar">';}
} else {
if(empty($row['avatar'])){
echo'<img class = "avatar_p" src="uploads/NoAvatar.jpg"
alt="avatar">';
} else { echo'<img class = "avatar_p"
src="uploads/'.$row['avatar'].'" alt="avatar">'; }

}
echo '<div class = "profile_p">
<div class = "vertical_space">'.$row['name'].'</div><div class =
"vertical_space">
User: '.$row['username'].'</div>
<div class = "vertical_space"> Sex: '.$row['gender'].'</div>
<div class = "vertical_space">'.$row['email'].'</div></div>'; }

echo'</br></br></br><div class = "top_band3">
</div><h2 class = "titlu_personal_feed">PERSONAL FEED</h2>
</br></br></br></br>';

$query = "SELECT id_post,usernam e,postare,date_post,viewz FROM
posts WHERE username = '$user' ORDER BY date_post DESC";
$result = mysqli_query($db,$query);
$posts = array();
$public = "public";
echo '<div class = "spatiu">';
while($row = mysqli_fetch_array($result)) {
if($user ==$_ SESSION['login_username']){
echo '<hr class = "baraintrepostari"></br></br></br>';
echo '<p class = "data_wall_personal">'.$row['date_post'].'&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;'.$user.'</p>';
echo '<p class = "viewz_wall_personal"> '.$row['viewz'].'</p>';
echo '<form action = "delete_post.php">
<input type="hidden" name="id_post" value="'. $row['id_post'].'"/>
<input class = "delete_button" type = "submit" value = "x"/></form>';
$posts[] = $row['postare'];
echo '<p class = "wall_personal">'.$row['postare'].'</p></br>';
} else {
if($row['viewz'] == $public){
echo '<hr class = "baraintrepostari"></br></br></br>';
echo '<p class = "data_wall_personal">'.$row['date_post'].'&nbsp;
&nbsp;&nbsp;&nbsp;& nbsp;'.$row['username'].'</p>';
$posts[] = $row['postare'];
echo '<p class = "wall_personal">'.$row['postare'].'</p>';
}}}
include("footer.php");
} else { header("location: ../error.php"); }
}
?>
</body>
</html>
index.css
( cod parțial – stilizarea meniului ; codul complet se găsește pe CD )

body {
font -family: 'Nunito', sans -serif;
color: #2b3238;
background -color: #def7f0;
}

nav {
position:absolute;
margin -top: 288px;
margin -left: 360px;
height:25px;
min-width:600px;
z-index: 2;
}
nav > ul > li {
font -size:20px;
color:white;
padding:10px 40px;
display:inline -block;
}

nav > ul > li> a {
text-decoration:none;
color:rgba(0,0,0,0.35);
transition:all linear 0.15s;
}

nav > ul >.current -item > a {
background -color:rgba(0,0,0,0.35);
text-align: center;
color: white;
padding: 3px 22px;
border -radius:10px;
border:none;
cursor: pointer;
width: 50px;
height: 28px;
z-index:2;
text-decoration:none;
}
nav> ul > li:hover> a {
background -color:rgba(0,0,0,0.35);
text-align: center;
color: white;
padding: 3px 22px;
border -radius:10px;
border:none;
cursor: pointer;
width: 50px;
height: 28px;
z-index:2;
}

Similar Posts