Documente Academic
Documente Profesional
Documente Cultură
Codruta-Mihaela ISTIN,
Obiective
SQL
Logice
NonRelationale
1
11/22/2014
Curs 1
Introducere
Editoare
Structura generala a unui fisier HTML
Sintaxa (tag si atribute)
Formatare de text
Bullet-list-uri
Formatare folosind tabele
inserare de imagini
Ancore
Adresarea resurselor
Rolul browser-ului
Comunicare intre browser si server
Editoare HTML
Ce este HTML
2
11/22/2014
<html>
<head>
<title>Titlu in bara browser</title>
</head>
<body>
<!-- comentariu -->
<p align=center>Index</p>
</body>
</html>
3
11/22/2014
TAG Efect
(nume)
<p>..</p> Declara un nou paragraf. Intre doua paragrafe exista o linie.
(paragraph)
<br/> Linie noua. In codul HTML nu conteaza cum este textul scris pe linii, findca acestea nu
(break) se iau in considerare. Pentru a se introduce o linie noua se foloseste <br/>
<b>..</b> Ingroasa textul din interiorul sau
(bold)
<u>..</u> Subliniaza textul din interiorul sau
(underline)
<i>..</i> Inclina textul din interiorul sau
(italic)
deoarece in codul HTML nu conteaza cate spatii exista unul dupa altul (ele se vor afisa ca un singur
spatiu), pentru a se afisa mai multe spatii se foloseste simbolul
daca se doreste afisarea caracterrului <, se foloseste simbolul < , pentru a nu se confunda cu
inceputul de tag; exista si alte simboluri pentru caractere speciale, ex: pentru copyright
Liste
<ul> rosu
<li>rosu</li> verde
<li>verde</li> albastru
<li>albastru</li>
</ul>
<ol> 1. Maria
<li>Maria</li> 2. Ion
<li>Ion</li> 3. Mihai
<li>Mihai</li>
</ol>
li = List Item
4
11/22/2014
5
11/22/2014
Inserare de imagini
Link-uri
6
11/22/2014
2 7
Baza de 5 1. Se trimite o cerere de pagina
date Interpretor PHP 2. Paginile PHP sunt trimise la
6 interpretorul PHP
(MySQL) 3,4. Interpretorul incarca de pe
3 4 disc codul sursa PHP
5,6. Daca exista interogare de
HDD baza de date, PHP-ul
interogheaza baza de date
7. Rezultatul final al interpretorului
PHP este un fisier HTML
8. Fisierul HTML rezultat e returnat
apelantului
<html>
<head></head>
<body>
<?php
echo salut;
?>
</body>
</html>
programele sau secventele PHP se scriu in interiorul unor fisiere HTML, care
trebuie sa aiba extensia .php
o secventa PHP incepe cu <?php si se incheie cu ?> . Unele servere sunt setate
sa accepte si doar <? , dar acest fel de a incepe nu este intotdeauna portabil
PHP-ul accepta si comenzi scrise direct, fara a fi nevoie ca acestea sa fie scrise
intr-o functie (ca in C)
comenzile de afisare gen echo sau print trimit caracterele de afisat chiar in
interiorul paginii care contine secventa PHP, incepand cu inceputul acesteia
in final toata secventa PHP este stearsa din codul PHP, fiind inlocuita cu
caracterele afisate in interiorul acesteia
7
11/22/2014
<html>
<head></head> <html>
<body> <head></head>
<?php <body>
echo salut; salut
?> </body>
</body> </html>
</html>
programele sau secventele PHP se scriu in interiorul unor fisiere HTML, care
trebuie sa aiba extensia .php
o secventa PHP incepe cu <?php si se incheie cu ?> . Unele servere sunt setate
sa accepte si doar <? , dar acest fel de a incepe nu este intotdeauna portabil
PHP-ul accepta si comenzi scrise direct, fara a fi nevoie ca acestea sa fie scrise
intr-o functie (ca in C)
comenzile de afisare gen echo sau print trimit caracterele de afisat chiar in
interiorul paginii care contine secventa PHP, incepand cu inceputul acesteia
in final toata secventa PHP este stearsa din codul PHP, fiind inlocuita cu
caracterele afisate in interiorul acesteia
Elemente de PHP
<?php
for($i=0;$i<5;$i++)
echo $i.</br>;
?>
8
11/22/2014
Elemente de PHP
<?php
for($i=0;$i<5;$i++)
echo $i.</br>; 0<br/>1<br/>2<br/>3<br/>4<br/>
?>
Elemente de PHP
<table border=<?php=$size?>><tr>
<?php
for($i=0;$i<3;$i++)
echo <td>$i</td>;
?>
</tr></table>
9
11/22/2014
Elemente de PHP
<table border=<?php=$size?>><tr>
<?php <table border=7><tr>
for($i=0;$i<3;$i++) <td>0</td><td>1</td><td>2</td>
echo <td>$i</td>; </tr></table>
?>
</tr></table>
Elemente de PHP
echo f1(25);
definirea unei functii se face folosind cuvantul cheie function, urmat de numele
functiei si de parametrii ei intre paranteze, fiecare parametru fiind si el prefi
la fel ca si in cazul variabilelor nu se dau tipurile argumentelor si nici tipul valorii
returnate, acestea putand avea orice tip
daca intr-o functie se doreste accesarea unor variabile globale, acestea se vor lista
prefixate de cuvantul global. Altfel orice nume de variabila e considerat local.
10
11/22/2014
Elemente de PHP
$persoane=array('Ion','Ana','Maria'); Maria
Ana
for($i=count($persoane)-1;$i>=0;$i--) Ion
echo $persoane[$i].'</br>'; --------------
echo '--------------</br>'; Ion
$persoane[]='Mihai'; // adaugare element in vector Ana
Maria
foreach($persoane as $p)echo "$p</br>"; Mihai
echo '--------------</br>'; --------------
$preturi=array('Mere'=>5.2, 'Pere'=>7.1,'Kiwi'=>5.5); Pret Mere: 5.2 lei
Pret Pere: 7.1 lei
$preturi['Avocado']=3.5; // adaugare element in vector Pret Kiwi: 5.5 lei
foreach($preturi as $sortiment=>$pret) Pret Avocado: 3.5 lei
echo "Pret $sortiment: $pret lei</br>;
11
11/22/2014
intr-o baza de date (BD) SQL, toate datele de acelasi fel sunt grupate intr-o tabela
o tabela are drept coloane toate campurile necesare pentru specificarea datelor
respective
fiecare linie dintr-o tabela contine o inregistrare distincta
persoane prieteni
id nume id_persoana Id_prieten
1 Ion 1 2
2 Ana 1 3
3 Mihai 2 1
3 1
in SQL nu exista legatura de date
2 3
directa, cum ar fi prin ponteri, pentru a se
specifica structuri de date complexe, gen 3 2
arbori
in exempul de mai sus, din cauza ca fiecare persoana poate sa aiba mai multi
prieteni, lista acestora a trebuit codificata intr-o alta tabela, relationarea intre ele
facandu-se pe baza unor coduri numerice
fiecare camp are un tip de date. Tipurile de date cel mai des intalnite:
12
11/22/2014
lista de baze de date apare in stanga si sus este meniul pentru creare de noi baze de
date, utilizatori, inserare cod SQL sau importare/exportare de date
pentru criterii de securitate, pentru fiecare bd se definesc unul sau mai multi
utilizatori, fiecare putand avea drepturi diferite utilizare a acelei bd
13
11/22/2014
la selectia unei bd, in stanga apar toate tabelele ei. Daca se apasa pe numele unei
tabele, apar inregistrarile din ea. Daca se apasa pe dreptunghiul din stanga ei, ii
apare structura
in orice mod sunt disponibile operatii de adaugare, modificare, stergere
14
11/22/2014
ENGINE defineste felul in care MySql isi stocheaza baza de date. MyIsam a fost
stocarea implicita pentru MySql inainte de v5.5. MyIsam este optimizat pentru situatii in
care sunt necesare foarte multe operatii de citire si doar putine de scriere, de exemplu
magazine virtuale in care doar rar se adauga produse noi, dar pot sa existe milioane
de vizualizari ale produselor zilnic. MySql, versiunile mai noi, au trecut la un alt format
de stocare numit InnoDB, care ofera mai multe facilitati, gen tranzactii sau foreign keys
in PHP exista mai multe seturi de functii cu ajutorul carora se poate realiza conexia la o
bd MySQL. Vom prezenta folosirea PDO (PHP Data Objects), o extensie care permite
mai multe operatii si este mai usor de folosit. Totodata PDO abstractizeaza mai multe
aspecte referitore la bd SQL, ceea ce permite ca modificand doar in putine locuri un
program, acesta sa poata folosi si alte bd SQL.
initial, in PHP trebuie initiata o conexie la serverul MySQL. Pentru aceasta se foloseste
urmatoarea constructie:
$bd = new PDO("mysql:host=localhost; dbname=e1",'user1','1');
new are acelasi inteles ca in Java sau C++, creand un nou obiect. Constructorul PDO
are urmatoarele argumente:
o primul argument consta dintr-un nume de driver (mysql) si mai multi parametri,
care specifica pe ce server este bd, numele ei, etc.
o al doilea argument este numele utilizatorului folosit pentru conexie
o al treilea argument este parola utilizatorului
in caz de succes, $bd va contine un obiect prin intermediul caruia se vor efectua
interactiunile cu bd
conexia se realizeaza o singura data, la inceputul programului si se foloseste ulterior
ori de cate ori este necesar
15
11/22/2014
<table border=1>
<tr><td>Nume</td><td>E-mail</td></tr>
<?php
$bd=new PDO("mysql:host=localhost;dbname=e1 Nume E-mail
,'user1','1');
$utilizatori=$bd->query('SELECT * FROM utilizatori'); Ion ion@mail.com
foreach($utilizatori as $utilizator){ Ana ana@mail.com
echo '<tr><td>'.$utilizator['nume']
.'</td><td>'.$utilizator['email'].'</td></tr>';
}
?>
</table>
[] = optional
nume1, = inseamna ca poate urma nume2, nume3, etc., cu optinile lui propr
* = toate campurile
in SQL nu se face distinctie intre litere mari si mici, dar prin conventie cuvintele
rezervate sunt scrise cu majuscule iar numele de campuri cu litere mici
16
11/22/2014
numele de dupa SELECT indica campurile (coloanele) de care avem nevoie (nu
conteaza ordinea din tabela)
tabelele de unde se extrag aceste coloane se specifica dupa FROM
dupa o comanda SQL se pune punct-virgula (;), pentru a o separa de urmatoarea
numele de dupa SELECT indica campurile (coloanele) de care avem nevoie (nu
conteaza ordinea din tabela)
tabelele de unde se extrag aceste coloane se specifica dupa FROM
dupa o comanda SQL se pune punct-virgula (;), pentru a o separa de urmatoarea
SELECT * FROM cadre; -- selecteaza toate campurile (*) din tabela cadre
SELECT functie, nume FROM cadre;
17
11/22/2014
numele de dupa SELECT indica campurile (coloanele) de care avem nevoie (nu
conteaza ordinea din tabela)
tabelele de unde se extrag aceste coloane se specifica dupa FROM
dupa o comanda SQL se pune punct-virgula (;), pentru a o separa de urmatoarea
SELECT * FROM cadre; -- selecteaza toate campurile (*) din tabela cadre
SELECT functie, nume FROM cadre; -- selecteaza doar functia si numele
daca exista WHERE, conditia specificata va selecta doar anumite inregistrari (linii)
18
11/22/2014
daca exista WHERE, conditia specificata va selecta doar anumite inregistrari (linii)
daca exista WHERE, conditia specificata va selecta doar anumite inregistrari (linii)
19
11/22/2014
daca exista WHERE, conditia specificata va selecta doar anumite inregistrari (linii)
daca exista WHERE, conditia specificata va selecta doar anumite inregistrari (linii)
20
11/22/2014
daca exista WHERE, conditia specificata va selecta doar anumite inregistrari (linii)
daca exista WHERE, conditia specificata va selecta doar anumite inregistrari (linii)
21
11/22/2014
daca exista clauza ORDER BY, inregistrarile selectate vor fi ordonate in ordinea
specificata
daca exista mai multe expresii dupa ORDER BY, prima oara se vor sorta
inregistrarile dupa prima expresie si daca exista mai multe inregistrari care sunt
identice din punct de vedere al primei expresii, ele se vor sorta dupa a doua expresie,
etc.
implicit, ORDER BY ordoneaza in ordine crescatoare (ASC). Daca se doreste
ordonare in ordine descrescatoare, se foloseste DESC dupa numele expresiei de
sortat
-- selecteaza in
-- ordine alfabetica dupa nume toate femeile
-- selecteaza numele
-- tuturor cadrelor, sortate in ordinea alfabetica a departamenteleor si in cadrul
-- fiecarui departament, sortate in ordinea descrescatoare e numarului de lucrari
daca exista clauza ORDER BY, inregistrarile selectate vor fi ordonate in ordinea
specificata
daca exista mai multe expresii dupa ORDER BY, prima oara se vor sorta
inregistrarile dupa prima expresie si daca exista mai multe inregistrari care sunt
identice din punct de vedere al primei expresii, ele se vor sorta dupa a doua expresie,
etc.
implicit, ORDER BY ordoneaza in ordine crescatoare (ASC). Daca se doreste
ordonare in ordine descrescatoare, se foloseste DESC dupa numele expresiei de
sortat
22
11/22/2014
daca exista clauza ORDER BY, inregistrarile selectate vor fi ordonate in ordinea
specificata
daca exista mai multe expresii dupa ORDER BY, prima oara se vor sorta
inregistrarile dupa prima expresie si daca exista mai multe inregistrari care sunt
identice din punct de vedere al primei expresii, ele se vor sorta dupa a doua expresie,
etc.
implicit, ORDER BY ordoneaza in ordine crescatoare (ASC). Daca se doreste
ordonare in ordine descrescatoare, se foloseste DESC dupa numele expresiei de
sortat
daca exista clauza GROUP BY, inregistrarile selectate se vor grupa conform
expresiilor de la GROUP BY
aceasta grupare este utila atunci cand dorim ca functiile care actioneaza pe toate
inregistrarile selectate (SUM, MAX) sa actioneze separat, in cadrul anumitor grupuri
-- pentru fiecare
-- departament selecteaza numele departamentului si media numarului de lucrari
-- selecteaza pentru fiecare
-- sex in parte numarul maxim de lucrari
ATENTIE: daca se foloseste GROUP BY, nu se mai pot accesa campurile individuale
ale inregistrarilor dintr-un grup, ci doar campuri sau expresii care sunt la fel pentru tot
grupul respectiv. De exemplu, SELECT nume, sex, MAX(lucrari) FROM cadre
GROUP BY sex nu va afisa decat in anumite situatii numele persoanei care are
numarul maxim de lucrari, de obicei afisandu-se numele primei sau ultimei persoane
din grup
23
11/22/2014
daca exista clauza GROUP BY, inregistrarile selectate se vor grupa conform
expresiilor de la GROUP BY
aceasta grupare este utila atunci cand dorim ca functiile care actioneaza pe toate
inregistrarile selectate (SUM, MAX) sa actioneze separat, in cadrul anumitor grupuri
ATENTIE: daca se foloseste GROUP BY, nu se mai pot accesa campurile individuale
ale inregistrarilor dintr-un grup, ci doar campuri sau expresii care sunt la fel pentru tot
grupul respectiv. De exemplu, SELECT nume, sex, MAX(lucrari) FROM cadre
GROUP BY sex nu va afisa decat in anumite situatii numele persoanei care are
numarul maxim de lucrari, de obicei afisandu-se numele primei sau ultimei persoane
din grup
daca exista clauza GROUP BY, inregistrarile selectate se vor grupa conform
expresiilor de la GROUP BY
aceasta grupare este utila atunci cand dorim ca functiile care actioneaza pe toate
inregistrarile selectate (SUM, MAX) sa actioneze separat, in cadrul anumitor grupuri
daca exista clauza WHERE, aceasta va fi evaluata prima si abia apoi va fi evaluat
GROUP BY
ATENTIE: daca se foloseste GROUP BY, nu se mai pot accesa campurile individuale
ale inregistrarilor dintr-un grup, ci doar campuri sau expresii care sunt la fel pentru tot
grupul respectiv. De exemplu, SELECT nume, sex, MAX(lucrari) FROM cadre
GROUP BY sex nu va afisa decat in anumite situatii numele persoanei care are
numarul maxim de lucrari, de obicei afisandu-se numele primei sau ultimei persoane
din grup
24
11/22/2014
daca exista clauza GROUP BY, inregistrarile selectate se vor grupa conform
expresiilor de la GROUP BY
aceasta grupare este utila atunci cand dorim ca functiile care actioneaza pe toate
inregistrarile selectate (SUM, MAX) sa actioneze separat, in cadrul anumitor grupuri
daca exista clauza WHERE, aceasta va fi evaluata prima si abia apoi va fi evaluat
GROUP BY
ATENTIE: daca se foloseste GROUP BY, nu se mai pot accesa campurile individuale
ale inregistrarilor dintr-un grup, ci doar campuri sau expresii care sunt la fel pentru tot
grupul respectiv. De exemplu, SELECT nume, sex, MAX(lucrari) FROM cadre
GROUP BY sex nu va afisa decat in anumite situatii numele persoanei care are
numarul maxim de lucrari, de obicei afisandu-se numele primei sau ultimei persoane
din grup
daca exista clauza HAVING, expresia sa va avea rolul de a selecta doar anumite
grupuri dintre cele formate de GROUP BY, (excluzandu-le pe celelalte)
expresia clauzei HAVING poate fi formata doar din nume de campuri dupa care s-a
facut GROUP BY sau din functii care actioneaza la nivel de grup.
25
11/22/2014
26
11/22/2014
lucrari
id cid nume data
1 5 Algoritm optimizat de parcurgere al arborilor generalizati 17.09.2011
2 5 Procesari SQL paralele 24.03.2007
3 6 Integrarea GPU in algoritmii de compilare 15.04.20012
4 6 Euristici in procesarea paralela 05.11.2011
5 4 Reducerea SAR la terminalele GSM 27.03.2013
SELECT nume FROM lucrari WHERE cid=6; -- selecteaza numele tuturor lucrarilor
-- care ii apartin cadrului cu id-ul 6 (Cori)
27
11/22/2014
SELECT COUNT( lucrari ) , dep FROM cadre, lucrari WHERE cadre.id = cid GROUP
BY dep
28
11/22/2014
SELECT COUNT( lucrari ) , dep FROM cadre, lucrari WHERE cadre.id = cid GROUP
BY dep
o selectie poate avea ca sursa de date rezultatele unei alte selectii. In acest caz
vorbim de selectii imbricate. Acestea sunt posibile deoarece rezultatul unei selectii
este tot o tabela (posibil de 1 sau 0 inregistrari), iar in aceasta tabela se pot face
ulterior noi selectii.
in cazul selectiilor imbricate este necesar ca fiecare dintre acestea sa primeasca
cate un alias. Aceste aliasuri vor fi considerate numele tabelelor temporare in care
vor fi stocate rezultatele fiecarei selectii imbricate.
29
11/22/2014
prima oara se va efectua selectul imbricat si va rezulta tabela t1, avand campurile
max_lucrari si d1
in a 2-a faza, se va efectua un join intre tabelele cadre si t1, conform conditiilor din
where, pentru a se asocia la fiecare departament si numar maxim de lucrari, una sau
mai multe persoane
30
11/22/2014
initial se executa selectia imbricata, care are ca rezultat o tabela (t1) cu doua
campuri (cid, nr_lucrari), si care asociaza pentru fiecare cid din lucrari, numarul de
lucrari inregistrate
se face join intre tabela cadre si tabela t1 dupa campul cid, pentru a se asocia
fiecarui cadru numarul de lucrari din tabela lucrari
rezultatul final este o tabela care contine numele cadrului si numarul sau de lucrari
din tabela lucrari, sortat descendent dupa numarul de lucrari si daca mai multe cadre
au acelasi numar de lucrari, intre ele vor fi sortate alfabetic
se poate observa ca nu a fost nevoie sa se prefixeze niciun nume de camp cu
numele tabelei careia ii apartine, din cauza ca in tabela t1 cu care s-a facut join la
cadre nu exista nicun camp care are un nume similar cu alt camp din cadre
31
11/22/2014
este posibil sa nu se dea toate campurile, cu conditia ca acestea (cele care nu sunt
date) sa aiba specificate la definirea tabelei valori implicite (DEFAULT). Totusi este
bine sa se dea de fiecare data toate campurile, fiindca astfel este mai usor pentru
programator sa testeze daca nu cumva a uitat vre-un camp
campurile AUTO_INCREMENT trebuie sa aiba ori valoarea 0, ori sa nu fie date,
pentru a ii permite bazei de date sa isi seteze valoarea corecta (cu 1 mai mare decat
maximul valorilor din tabela)
ca peste tot in SQL, valorile numerice sunt date ca numere, iar cele de tip caracter
sau sir de caracter sunt date intre apostroafe () sau ghilimele ()
ca valori se pot specifica si expresii sau functii:
NOW() este o functie care se evalueaza in functie de context (tipul campului data) la
o valoare de tip DATE, TIME sau DATETIME, care este chiar data si timpul de
introducere a unei inregistrari in tabela
stergerea uneia sau a mai multor inregistrari dintr-o tabela se face cu instructiunea:
sterge din tabela nume_tabela toate campurile care indeplinesc conditia data
ATENTIE: in cazul in care exista relatii intre tabele, trebuie avut grija sa se respecte
consistenta (integritatea) inregistrarilor dupa operatiile de stergere. Integritatea
inregistrarilor se mentine daca dupa stergere nu vor exista inregistrari care sunt
dependente de cele sterse si care nu au sens fara acestea. De obicei, la operatiile de
stergere, se sterg prima data inregistrarile dependente si apoi inregistrarea de baza.
De exemplu, daca s-a sters dintr-un magazin virtual o categorie de produse, trebuie
sterse toate produsele din acea categorie (daca ele nu au fost in prealabil
redistribuite la alte categorii), fiind ca ele oricum nu vor mai putea fi afisate sau
prelucrate corect dupa aceea.
32
11/22/2014
tabela lucrari contine lucrarile cadrelor din tabela cadre. Campul id din cadre este
intr-o relatie de 1..n cu campul cid din lucrari
prima oara s-au sters din tabela lucrari toate inregistrarile corespunzatoare cadrului
cu id-ul 5, iar ulterior s-a sters din cadre chiar cadrul respectiv (cu id-ul 5)
ca rezultat final, s-a sters atat cadrul specificat cat si toate lucrarile sale si baza de
date isi pastreaza consistenta (integritatea)
este foarte important ca la stergere conditia data sa fie strict specifica pentru
inregistrarile care trebuiesc sterse. Din acest motiv se prefera in marea majoritate a
cazurilor sa se stearga dupa id-uri care sunt unice. Daca in exemplul de mai sus, s-ar
fi sters din tabela cadre folosind conditia WHERE nume=Adi, ar fi existat pericolul sa
se stearga si alte cadre care au tot numele Adi
cand se proiecteaza aplicatii de baze de date, este bine ca in sectiunea de
administrare sa existe o optiune de verificare a consistentei bazei de date, de
exemplu sa caute si sa stearga toate produsele fara categorie, toate comentariile fara
articolele la care au fost facute, etc
33
11/22/2014
este foarte important ca la actualizare conditia data sa fie strict specifica pentru
inregistrarile care trebuiesc actualizate. Din acest motiv se prefera in marea
majoritate a cazurilor sa se actualizeze dupa id-uri care sunt unice. Daca in exemplul
de mai sus, s-ar fi actualizat in tabela cadre folosind conditia WHERE nume=Ana, ar
fi existat pericolul sa se actualizeze si alte cadre care au tot numele Ana
se observa din al 2-lea exemplu ca s-a putut folosi valoarea anterioara a unui camp
din inregistrarea respectiva, pentru ca pe baza acesteia sa se calculeze noua valoare
Observatie: intotdeauna valorile care apar in partea dreapta a semnului egal (=) intr-
un SET, se refera la valori ANTERIOARE actualizarii (valorile care se afla stocate
curent in inregistrarea de actualizat).
se observa din al 3-lea exemplu ca un UPDATE poate modifica mai multe
inregistrari. Clauza WHERE poate chiar sa lipseasca complet si atunci se vor
modifica toate inregistrarile din tabela
34
11/22/2014
https://www.google.ro/search?q=timisoara&lr=lang_ro
cand datele transmise prin GET sunt receptionate de PHP, acestea sunt automat
decodificate din formatul lor specific si toate perechile de (variabila,valoare) sunt
depuse in vectorul asociativ $_GET inainte de executia scriptului PHP
$_GET este superglobal, adica este automat vizibil in functii fara a mai fi necesar sa
fie declarat la inceputul functiei cu global
35
11/22/2014
cand se apasa pe butonul avand textul Login, se vor trimite la server (submit) doua
variabile prin POST: email si parola, avand valorile introduse de utilizator in
campurile respective (tipurile text si password ale tagului input genereaza variabile)
si o variabila prin GET: actiune
if($_GET[actiune]==login)
echo pentru utilizatorul avand email-ul <b>.$_POST[email]
.</b> s-a transmis parola <font
color=red>.$_POST[parola].</font>;
pentru exemplul anterior, in care se doreste logarea unui utilizator avand email-ul
ion@mail.com si parola aaa, pe ecran va aparea:
36
11/22/2014
37
11/22/2014
$actiune=isset($_GET[actiune])?$_GET[actiune]:;
if($actiune==adauga)
NOTA: fiecare browser afiseaza diferit tag-ul input. La unele browsere diversele tipuri
(type) de input mai noi pot lipsi si atunci se va afisa o simpla casuta de introdus text. In
principiu se poate conta pe tipurile: button, checkbox, file, hidden, image, password,
radio, reset, submit, text
38
11/22/2014
39
11/22/2014
40
11/22/2014
41
11/22/2014
42
11/22/2014
PHP: securitate
ATENTIE: la proiectarea unui site, trebuie avut in vedere ca ORICE DATE PRIMITE DE LA
UTILIZATORI POT FI INCERCARI DE SPARGERE A SITE-ULUI.
daca un hacker reuseste sa aiba acces nepermis la un site sau server, trebuie avut in vedere
ca multe actiuni ii devin posibile: accesul la intreaga baza de date (deci nume de utilizatori, e-
mailuri, parole, carti de credit, ), posibilitatea de a folosi server-ul pentru a trimite spam sau
pentru a stoca fisiere descarcabile de pe internet, folosirea serverului ca proxy pentru a-si masca
propria locatie, etc. Chiar daca site-ul nostru poate sa nu fie de mare interes, trebuie tinut cont
de faptul ca utilizatorii in general isi folosesc aceeasi parola peste tot si atunci, daca parola lor
este stocata in clar in baza de date, un hacker care a spart site-ul si colecteaza parolele, le va
putea folosi la alte site-uri mult mai importante pentru utilizatorul respectiv (paypal, ebay, yahoo,
facebook, gmail, )
toate datele primite trebuie verificate si evaluate posibilitatile de a produce pagube la folosirea
lor
toate datele prezentate utilizatorului (facute publice), trebuie evaluate pentru a nu fi de ajutor
daca le vede un posibil hacker, daca acesta doreste folosirea lor in alte scopuri decat cele
intentionate. In acelasi timp, datele personale ale utilizatorilor (adresa, nr. tel.) trebuie facute
publice doar cu prevenirea sau acordul expres al acelui utilizator, fiindca pot fi folosite in scopuri
rele. E-mail-ul cel mai bine se va afisa sub forma de imagine, pentru a nu da posiblitatea
agentilor automati care cauta e-mail-uri pe internet sa-l gaseasca si sa-l foloseasca pentru a
trimite spam.
formularele de autentificare trebuie prevazute cu un contor de incercari, pentru a elimina
posibilitatea incercarilor automate, in serie, pentru spargerea parolelor
PHP: securitate
daca se da posibiltatea sa se faca upload de fisiere (imagini, etc), toate fisierele
trebuiesc verificate sa corespunda intr-adevar doar tipurilor permise (imagini, pdf, )
pentru a nu se permite upload-ul unor fisiere script sau executabile pe server, care
apoi vor putea fi folosite ca backdoor-uri. posibilitatea incercarilor automate, in serie,
pentru spargerea parolelor
la fisierele trimise deja, trebuie eliminata posibilitatea de a le modifica extensia dintr-
una inofensiva intr-una care sa le permita executia pe server
in general la fisiere si orice alte date de volum mare trebuie efectuate verificari de
spatiu, in asa fel incat un utilizator sa nu poata folosi mai mult spatiu decat ii este
permis.
la fisiere trebuie avut in vedere ca un fisier nou sa nu aiba acelasi nume ca alt fisier
vechi, pentru a nu-l sterge pe cel vechi, care poate apartine altui utilizator. In acest
sens, cel mai bine este sa se redenumeasca fisierele folosind identificatori unici.
cand se stocheaza date de la utilizator in baza de date, trebuie avut in vedere ca
datele trimise pot contine caractere speciale (ghilimele, apostroafe, semnul mai mic,
and, ), care daca nu sunt tratate corespunzator, pot fi afisate gresit sau chiar sa
compromita securitatea site-ului. De exemplu, semnul mai mic (<), daca este afisat in
mod direct poate fi interpretat ca inceput de tag si atunci sa compromita toata
structura HTML-ului de dupa el. Din acest motiv toate caracterele care au o
interpretare speciala in HTML trebuie codate in mod special (folosind htmlentities())
43
11/22/2014
daca un hacker introduce unul dintre textele de mai sus in loc de un text obisnuit care
in interogarea SQL este pus intre ghilimele () sau inter apostroafe (), rezultatul va fi
urmatorul: ghilimeaua sau apostroful de inceput va inchide caracterele pentru campul
curent, punct-virgula (;) va termina query-ul curent si se va executa urmatorul query
(delete * from users), care va sterge toate conturile utilizator. Cele doua minusuri (--)
de final au rolul de a considera tot ce ar fi urmat in query-ul initial drept comentariu:
select id from users where name= and password=
devine
select id from users where name=;delete * from users; -- and password=
pentru a se elimina acest gen de atac trebuie ca toate datele care se introduc in baza
de date sa aiba caracterele speciale pentru SQL modificate in asa fel incat sa isi piarda
caracterul lor special, analog secventelor ESCAPE din C. In PHP se poate folosi
pentru aceasta functiile PDO::query sau PDO::prepare
$bd=new PDO("mysql:host=localhost;dbname=e1,'user1','1');
$stm=$bd->prepare(select id from users where user=? and password=?);
$bd->execute(array($_POST[user], $_POST[password]));
se poate constata ca in fata primei ghilimele din sirul user s-a pus un (\). Acesta
face ca aceasta ghilimea sa isi piarda semnificatia de terminator de sir si sa devina
un simplu caracter din cadrul sirului (la fel ca folosirea \ in C in printf)
OBSERVATIE: ? folosit in prepare nu se pune intre ghilimele sau intre apostroafe
44
11/22/2014
Va multumesc!
45