Si daca totusi uitam!
Scriam in postul trecut cat de important este sa verifici tot input-ul de la utilizatori. Este de ajuns doar unu sa fie sarit si site-ul poate fi vulnerabil.
Dar daca totusi gresim si uitam sa validam un input ? Ce putem face in cazul in care site-ul este vulnerabil la SQL Injection?
Pentru astfel de cazuri folosesc urmatoarea solutie :
In toate site-urile care lucrez cu baze de date folosesc o clasa/functie pentru a executa interogarile sql. O functie ar arata asa:
function doQuery($strQuery)
{
return mysql_query($strQuery);
}
Si astfel voi folosi aceasta functie pentru toate interogarile.
Pasul urmator este de a modifica aceasta functie astfel incat atunci cand are loc o eroare SQL sa-mi bage eroarea intr-o tabela in baza de date cu urmatoarele informatii IP,data,SQL-ul,SQL-ul codat in base64 .
In continuare se va verifica daca ip-ul respectiv a declansat in total un maxim de (sa zicem) 5 erori. In acest caz il trecem intr-o tabela de ban-uri. Tabela de ban-uri va fi verificata evident la accesul oricarei portiuni din frontend.
Deci o astfel de functie arata asa :
function doQuery($strQuery)
{$rt= mysql_query($strQuery);
if (mysql_errno())
{
if (doQueryGetColumn(”SELECT COUNT(*) as total FROM modules_errors WHERE ip=’”.$_SERVER['REMOTE_ADDR'].”‘”,”total”)==4)
{
$dataset=array();
$dataset['state']=’denied’;
$dataset['data']=date(”Y-m-d H:i:s”);
$dataset['ip']=$_SERVER['REMOTE_ADDR'];
$dataset['description']=”Banned after unknown SQL errors(more than 4)”;
bansMod::add($dataset);mail (”email@email.ro”,”Attack detected on <nume site> ! FROM “. $_SERVER['REMOTE_ADDR'],$strQuery);
}
}
// inseram in baza de date eroarea
mysql_query(”INSERT INTO errors SET type=’sql’, extra=’”.make_safe($strQuery).”‘, query=’”.base64_encode($strQuery).”‘, data=’”.date(”Y-m-d H:i:s”).”‘, ip=’”.$_SERVER['REMOTE_ADDR'].”‘, error=’”.make_safe(mysql_error()).”‘”);// in cazul in care incercarea de a insera da eroare atunci inseram fara a mai adauga si SQL-ul in plain-text
if (mysql_errno())
mysql_query(”INSERT INTO modules_errors SET type=’sql’, query=’”.code($strQuery).”‘, data=’”.date(”Y-m-d H:i:s”).”‘, ip=’”.$_SERVER['REMOTE_ADDR'].”‘, error=’”.make_safe(mysql_error()).”‘”);
return false;
}
return $rt;
}
In acest mod daca va fi un atac asupra site-ului vom sti aproape imediat(depinde cat de des ne verificam adresa de mail). De obicei nici un atac nu reuseste numai dupa 5 erori in baza de date. Si odata ce cele 5 erori apar… respectivul are ban pe tot siteul iar noi avem informatiile necesare pentru a repara greseala!
Tags: securitate, SQL injection, tutorial