Documente Academic
Documente Profesional
Documente Cultură
SQL
SQL
--------------------
Este bine sa se faca filtrare dupa tipul variabilelor.
Daca este integer sa se obtina integer din variabila, oricare ar fi input-ul.
Se poate face prin cast-ing, rezultatul fiind truncherea numarului pana la primu
l caracter diferit de cifra.
$id = (int)$_GET['id'];
Exemplu 1:
Input:
http://filebox.ro/?id=12345' or 1='1
Rezultat:
$id = 12345
======================
Unii oameni prefera sa foloseasca expresii regulate pentru filtrare.
Elimina tot ce nu este cifra, astfel raman doar cifrele, oriunde s-ar afla ele i
n input.
$id = preg_replace("/^d/", "", $_GET['id']);
Exemplu 2:
Input:
http://filebox.ro/?id=12345' or 1='1
Rezultat:
$id = 1234511;
======================
Un alt exemplu de cast-ing folosind sprintf.
$query = sprintf("SELECT file_id FROM files WHERE id='%d'", $_GET['id']);
Exemplu 3:
Input:
http://filebox.ro/?id=12345' or 1='1
Rezultat:
$query = "SELECT file_id FROM files WHERE id='12345'";
==================================================
Pentru filtrare de tipul string sunt necesare 2 lucruri:
mysql_real_escape_string()
si ' (apostroafe)
Exemplu 1:
$queryRetrieveId = "SELECT file_id FROM files WHERE username=". mysql_real_escap
e_string($_GET['username']) ."";
Rezultat:
Codul este vulnerabil la SQL Injection.
Desi se foloseste mysql_real_escape_string, valoarea cu care se compara coloana
"username" nu este inchisa in apostroafe,
ceea ce inseamna ca atacatorul nu are nevoie sa introduca ' pentru a iesi din da
te si a putea injecta SQL.
http://filebox.ro/?id=12345 or 1=1 <-- este SQL valid si se executa
Exemplu 1:
$queryRetrieveId = "SELECT file_id FROM files WHERE username='". mysql_real_esca
pe_string($_GET['username']) ."'";
In acest caz atacatorul trebuie neaparat sa introduca ' pentru a termina definit
ia content-ului si a putea introduce cod SQL.
Totusi daca el introduce ' functia mysql_real_escape_string o sa transforme cara
cterul din delimitator in content si practic este asimilat
o data cu restul datelor introduse in aceeasi coloana SQL.