Sunteți pe pagina 1din 2

Ce este SQL injection ?

Tehnica SQL injection da posibilitatea unui atacator sa execute comenzi SQL neau
torizate porfitand de oportunitati neortodoxe de intrare in aplicatiile web cons
truind interogari SQL dinamice.
Acesta devine posibil deoarece PHP combina sirurile interogarilor MYSQL pe care
le setezi cu variabila inainte pentru ca cineva sa poata adauga o a doua interog
are sau schimba interogarea ta pentru a le oferi informatii sau acces pe care nu
ar trebui sa il aiba. Cele mai obisnuite dintre aceste intrari includ apostrofu
ri unescaped in declaratiile SQL.
PROBLEMA
Considerati urmatoarea interogare SQL in PHP:
Cod:
$result=mysql_query('SELECT * FROM users WHERE username="'.$_GET['username'].'"'
);
Interogarea selecteaza toate randurile din tabelul userilor unde username-ul est
e acelasi cu cel din sirul de interogari. Daca priviti cu atentie, veti realiza
ca declaratia este vulnerabila la SQL injection - apostroful in $_GET['username'
] nu sunt , si prin urmare nu vor fi cuprinse ca parte din declaratie, ceea ce p
ermite un comportament defectuos.
Ganditi-va ce s-ar intampla daca $_GET['username'] ar fi urmatorul: " OR 1 OR us
ername = " (dublu apostrof, urmat de textualul " OR 1 OR username = " urmat de u
n alt dublu apostrof). Cuprins in expresia originala, interogarea devine urmatoa
rea: SELECT * FROM users WHERE username = "" OR 1 OR username = "". Altfel, un d
ublu apostrof va ramane la sfarsitul afirmatiei.
Aceasta selecteaza toate sirurile din tabelul userilor. Desi nu pare periculos,
alte coduri infectate pot fi adaugate, mai ales in interogarile DELETE sau UPDAT
E care modifica tabelul.
De asemenea, un alt sir de coduri SQL poate fi adaugat la SELECT * FROM `users`
WHERE username = '' adaugand un apostrof sau o semicoloana la sfarsit, astfel si
rul devine SELECT * FROM `users` WHERE username = ''; ' care cu usurinta se tran
sforma in SELECT * FROM `users` WHERE username = ''; DELETE * FROM `forum` WHERE
title != ''
SOLUTIA
Niciodata sa nu aveti incredere in informatiile userului, procesati informatia n
umai dupa validare. De regula, aceasta se face prin pattern matching. In exemplu
l urmator, username-ul este restrictionat la caractere alfanumerice plus undersc
ore si cu o lungime cuprinsa intre 8-20 caractere modificati la nevoie.
Cod:
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
$result = mysql_query("SELECT * FROM users WHERE username=$matches[0]");
else // we don't bother querying the database
echo "username not accepted";
O buna practica in codare afirma ca apostrofurile duble ar trebuie folosite mere
u in oricarei informatii variabile. Ori folosing slash dublu apostrof , ori apos
trof simplu, cadrand intreaga interogatie, pentru ca tipul opus de interogatie s
a nu trebuiasca escaped, desi acelasi tip de apostrof trebuie escaped.
Cod:
$result = mysql_query('SELECT * FROM users WHERE username = "$usern"');
or
Cod:
$result = mysql_query("SELECT * FROM users WHERE username = \"$usern\" ");
Pentru o siguranta mai mare, renuntati la executarea scriptului inlocuind echo c
u exit() or die().
Aceasta inca se mai aplica atunci cand se folosesc checkboxuri, butoane ratio, l
iste de selectie, etc. Orice browser cerut (chiar si POST) poate fi REPLICATED p
rin telnet, situri duplicate, javascript, sau codare(chiar si PHP), asadar intot
deauna trebuie sa fiti prevazatori in privinta restrictiilor pentru codarea afer
enta clientului.
Folosirea mysql_real_escape_string()
PHP ofera o functie care se ocupa cu inserarea userului in MySQL, si aceea este
mysql_real_escape_string(string unescaped_string[, resource link_identifier]). A
cest script scapa de toate caracterele potential periculoase din sir si transfor
ma sirul escaped intr-unul prudent pentru a fi folosit in sirul MySQL.
(Functia originala, myqsl_escape_string, nu a luat in considerare caracterul cur
ent pentru a iesi din sir, nici nu a acceptat argumentul conexiunii. Este dezapr
obata inca de la PHP 4.3.0) Spre exemplu, luati urmatorul exemplu:
Cod:
$result=mysql_query('SELECT * FROM users WHERE username="'.$_GET['username'].'"'
);
Aceasta poate fi escaped dupa cum urmeaza:
Cod:
$result=mysql_query('SELECT * FROM users WHERE username="'.mysql_real_escape_str
ing($_GET['username']).'"');
Astfel, daca userul a incercat sa insereze o alta declaratie in afara de DELETE,
ar fi interpretat inofensiv ca o parte din parametrul clauza WHERE:
Cod:
SELECT * FROM `users` WHERE username = '\';DELETE * FROM `forum` WHERE title !=
\''
Backslashurile adaugate de mysql_real_escape_string face ca MySQL sa le interpre
teze ai degraba ca si caractere cu un singur apostrof decat ca si parte din decl
aratia SQL.
Luati la cunostinta cu MySQL nu permite multe interogari asadar DELETE FROM din
tabel nu merge oricum.
postat de painmaster sau ceva de gen Wink nu zicea de cine e facut

S-ar putea să vă placă și