Sprečavanje napada SQL inekcijom
Napad SQL inekcijom je jedan od najraširenijih napada u zadnje vrijeme i to ne samo u Joomla CMS-u, nego i u mnogim drugim CMS-ovima. Ova tehnika napada je jako stara, čak starija i od Joomla-e. Postoje razni načini zaštite od SQL inekcija od koji su neki i automatizovani, ali oni ne garantuju 100% zaštitu i sigurnost. Većinom se mogućnost napada SQL inekcijom javlja u komponentama i modulima razvijenim od trećih lica, ali i u oficijalnim Joomla komponentama i modulima.
Kako se zaštiti od ovoga saznajte u nastavku teksta.
Spisak svih komponenti i modula sa mogućnost napada SQL inekcijom, kao i sa trenutnim statusom otklanjanja istog možete naći na:
http://docs.joomla.org/Vulnerable_Extensions_List.
U nastavku teksta možete da vidite nekoliko analiza i savjeta kako ručno, u kodu, ispraviti mogućnost SQL inekcije i zaštiti se.
Forsiraj korištenje tipa varijable koji je potreban
Ukoliko očekuješ varijablu tipa Integer, forsiraj u kodu da to i bude.
$sql = 'UPDATE #__mytable SET `id` = ' . (int) $int;
Ukoliko želiš da ubaciš datum, koristi JDate koji vraća validan mysql format datuma ...
$date =& JFactory::getDate($mydate);
$sql = 'UPDATE #__mytable SET `date` = ' . $db->quote( $date->toMySQL(), false);
UVIJEK koristi 'Escape' za varijable
Korištenjem Escape funkcije postižeš dodatnu sigurnost vrijednosti unešenih od strane korisnika:
$sql = 'UPDATE #__mytable SET `string` = ' . $db->quote( $db->getEscaped( $string ), false );
Ovdje se zapravo koriste 2 funkcije. Jedna koja je Escape i druga koja dodaje navode ( ' ). Drugi parametar za $db je postavljen na 'false'. Ukoliko ostane tako ili je postavljen na 'true' onda se on sam izbriše i postaje:
$sql = 'UPDATE #__mytable SET `string` = ' . $db->quote( $string );
Sprečavanje DOS napada
U WHERE upitu, ukloliko koristiš LIKE komandu, moguće je da ostane otvorena mogućnost DOS napada jer nije korištena Escape funkcija za specijalne znakove '%' i '_'. Joomla pruža mogućnost da uradi to automatski. $db->getEscaped može uzeti drugi parametar i isključiti te specijalne znakove automatski. U slučaju da koristiš LIKE komandu ovaj proces nije automatizovan i to moraš uraditi sam na sljedeći način:
$sql = 'UPDATE #__mytable SET .... WHERE `string` LIKE '.
$db->quote( $db->getEscaped( $string, true ), false );
Sprečavanje XSS napada
Većina programera povlači podatke koristeći JRequest funkciju, iako postoji mnogo drugih metoda i načina da se to urradi bolje i sigurnije. Neko od njih su date u daljnjem tekstu:
Za Integere:
$int = JRequest::getInt( $name, $default );
Za Floatse (decimalne):
$float = JRequest::getFloat( $name, $default );
Za Boolean vrijednosti (true/false):
$bool = JRequest::getBool( $name, $default );
Za "riječi" (moguće samo za ALFA znakove i _ specijalni znak)
$word = JRequest::getWord( $name, $default );
ZA "komande" (moguće za alfa znakove, brojeve, te specijalne znakove . - i _ )
$cmd = JRequest::getCMD( $name, $default );
Za NON-HTML tekst
$string = JRequest::getString( $name, $default );
Do sljedećeg puta ...
(preuzeto sa http://developer.joomla.org/security/articles-tutorials/258-preventing-sql-injections.html)