Az utóbbi időben sok rosszul értelmezett megoldás született arról, hogyan lehet a külső bővítmények kódját megvédeni az SQL injekciós támadásoktól. Az igazság az, hogy a JRequest használata nem elég! Most bemutatásra kerül néhány módszert, amelyekkelaz SQL támadások kivédhetők. Nem olyan bonyolult, van pár egyszerű dolog amivel megelőzhetünk egy injekciós támadást. Egyesével végigmegyünk ezeken a módszereken és mutatunk néhány példát is.
Tartalomjegyzék |
Ha egy integer típusú adatot várunk, akkor kényszerítsük az integer (vagy float) típus használatát. Például:
$sql = 'UPDATE #__mytable SET `id` = ' . (int) $int;
Ha dátumot akarunk alkalmazni, akkor használjuk a JDate osztályt, amely minden alkalommal egy érvényes dátumot és időt ad vissza.
$date =& JFactory::getDate($mydate);
$sql = 'UPDATE #__mytable SET `date` = ' . $db->quote( $date->toMySQL(),
false);
Minden egyes alkalommal, amikor a felhasználótól egy string típusú adatot kapunk, a speciális karakterek elé tegyünk feloldójelet:
$sql = 'UPDATE #__mytable SET `string` = ' . $db->quote(
$db->getEscaped($string), false );
Két funkciót használunk itt. Az egyik elhelyezi a feloldójeleket a stringben, a másik idézőjelek közé teszi. Észrevehetjük, a $db->quote() második paramétere false értéket ad... Ha ezt kihagyjuk, vagy true-ra állítjuk az értékét, akkor elhelyezi a feloldójeleket. Tehát:
$sql = 'UPDATE #__mytable SET `string` = ' . $db->quote( $string );
Ha WHERE utasításnál a LIKE parancsot is használjuk, akkor egy DoS támadás érhet, ha nem oldjuk fel a speciális % és _ karaktereket. A Joomla! képes ezt elvégezni számunkra! A $db->getEscaped fogad egy második paramétert, amely feloldja ezeket a karaktereket. Megjegyzem, csak akkor kell feloldanunk ezeket a karaktereket, ha a LIKE utasításban szerepelnek. Tehát:
$sql = 'UPDATE #__mytable SET .... WHERE `string` LIKE '.
$db->quote( $db->getEscaped( $string, true ), false );
A legtöbb ember a JRequest::getVar() függvénnyel hívja meg az adatokat... Viszont van számos egyéb módszer, amely jobban kényszeríti a típust. Pár ilyen módszer:
Integer típushoz:
$int = JRequest::getInt( $name, $default );
Float típushoz:
$float = JRequest::getFloat( $name, $default );
Boolean típushoz (igaz/hamis):
$bool = JRequest::getBool( $name, $default );
Karakterlánchoz (betűk és a _ karakter):
$word = JRequest::getWord( $name, $default );
Parancsokhoz (betűk, számok és a . - _ karakterek):
$cmd = JRequest::getCMD( $name, $default );
Nem HTML szöveghez (minden HTML rész el fog veszni):
$string = JRequest::getString( $name, $default );