SQL injekció megelőzése

A JoomlaWiki wikiből

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

Típus kényszerítése

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:

  1. $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.

  1. $date =& JFactory::getDate($mydate);
  2. $sql = 'UPDATE #__mytable SET `date` = ' . $db->quote( $date->toMySQL(), 
  3. false);

Mindig használjunk feloldójelet string típusú adatoknál

Minden egyes alkalommal, amikor a felhasználótól egy string típusú adatot kapunk, a speciális karakterek elé tegyünk feloldójelet:

  1. $sql = 'UPDATE #__mytable SET `string` = ' . $db->quote( 
  2. $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:

  1. $sql = 'UPDATE #__mytable SET `string` = ' . $db->quote( $string );

DoS támadások megelőzése

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:

  1. $sql = 'UPDATE #__mytable SET .... WHERE `string` LIKE '. 
  2.   $db->quote( $db->getEscaped( $string, true ), false );

XSS támadások kivédése

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:

  1. $int = JRequest::getInt( $name, $default );

Float típushoz:

  1. $float = JRequest::getFloat( $name, $default );

Boolean típushoz (igaz/hamis):

  1. $bool = JRequest::getBool( $name, $default );

Karakterlánchoz (betűk és a _ karakter):

  1. $word = JRequest::getWord( $name, $default );

Parancsokhoz (betűk, számok és a . - _ karakterek):

  1. $cmd = JRequest::getCMD( $name, $default );

Nem HTML szöveghez (minden HTML rész el fog veszni):

  1. $string = JRequest::getString( $name, $default );