Bejárat > IT biztonság > SQL injekció 1. rész: Mit is jelent a fogalom?

SQL injekció 1. rész: Mit is jelent a fogalom?

Első lépésként ismerkedjünk meg az SQL injekció fogalmával. Az injekció (gondoljunk csak egy védőoltásra) azt jelenti, hogy egy pici lyukon át valamilyen anyagot a szervezetbe juttatunk, ami aztán ott kifejtheti a pozitív / negatív hatásait. Az SQL injekció is pontosan ezt jelenti, csak itt a weblapunk az, amin keresztül az “anyagot” a honlap mögötti adatbázisba juttatjuk SQL utasítások formájában. Nézzük meg, milyen pici lyuk lehet egy weblapon. A példánk legyen egy képgaléria, aminél ha a kis képre rákattintunk, megjelenik az oldalon a nagy kép.

A képgaléria (ahol a kis képek vannak) url-je a példában legyen:

/category.php?category_id=15

Amikor egy konkrét képre rákattintunk, akkor az url legyen ez:

/picture.php?picture_id=1128

Mindkét URL esetén GET típusú paraméterátadás történik, ami azt jelenti, hogy a böngésző címsorában látszanak a paraméterek. Mind a kategória, mind a kép oldalon érvényes  a teszt, válasszuk ki az egyiket, legyen a kép oldala. Amikor a picture_id = 1128 átadódik az php oldalnak, akkor ha nem vagyunk elég figyelmesek, ezt kapásból egy SQL utasításba pakoljuk bele. Valahogy így:

$picture_id = $_GET["picture_id"];
$e = mysql_query("SELECT * from pictures WHERE id = $picture_id;");

Ebben az esetben megjelenik a kép és mindenki örül. Ám ezen a ponton bizony vétettünk egy biztonsági rést, amin keresztül a honlapunk támadhatóvá válik. Miért is? Mi történik, ha a címsorban átírom a paraméter listát erre:

/picture.php?picture_id=1128; DROP TABLE adatbazis; <= a szóközök helyett a %20 szükséges

Ebben az esetben a paraméter bejut a php fileba és a következőképpen alakul az SQL utasításunk:

SELECT * from pictures WHERE id = 1128; DROP TABLE adatbazis;

Szintaktikailag helyes? Igen, helyes!
Végre fog hajtódni? Igen végre!
Lesz utána adatbázisunk? Nem, nem lesz!

Ezt egyszerűen ki tudjuk javítani, ha a php kódban először leellenőrizzük a paraméterünket. Pl. így:

$picture_id = $_GET["picture_id"];
if(is_numeric($picture_id))
    $e = mysql_query("SELECT * from pictures WHERE id = $picture_id;");

A következő részben bemutatok pár példát, hogy mennyire veszélyes is ez a támadás és hogy milyen fajtái lehetnek.

Categories: IT biztonság Tags: