Archive for March, 2009

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? ce e aia ?

Dupa o lunga perioada de timp am revenit cu un nou post.. si sper ca de acum in colo sa scriu mai des.

Astazi va voi vorbi cum sa incepeti sa va asigurati site-ul si ce sa face ti pentru o mai multa siguranta la codare.

Pentru inceput ar trebui sa fie stiut ca absolut tot ceea ce se primeste de la useri trebuie verificat.. si sa se presupuna ce e un posibil atac. Deci toate variabilele primite prin GET,POST,COOKIE, etc.. trebuie facute “safe” . Pentru asta puteti folosi o functie de genu:

function make_safe($value, $allow_html=false,$remove_html=false)
{
if ($remove_html)
$value=strip_tags($value);

if (!$allow_html)
$value=htmlspecialchars($value);
// Stripslashes
if (get_magic_quotes_gpc())
$value = stripslashes($value);

// Quote if not a number or a numeric string
if (!is_numeric($value))
$value = mysql_real_escape_string($value);

return $value;
}

Astfel folosind o astfel de functie puteti sa va protejati impotriva atacurilor de timp SQL Injection sau XSS.

Tags: , , ,