WebElektronika

Védekezés az SQL Injection ellen

person access_time 2014.06.24.
Az SQL Injection módszer nem új, de sajnos a mai napig használható néhány oldalnál. Ezért megnézzük ezt a biztonsági rést, majd javaslatokat olvashatunk ennek a kiküszöböléséről.


A szerver - kliens közötti kapcsolat több módon is támadható. Megváltoztathatunk paramétereket, módosíthatjuk a munkamenetet, illetve SQL Injection-t is alkalmazhatunk.

Az SQL Injection során az alkalmazásunk által használt adatbázisunk manipulálhatóvá válik, ha nem védekezünk ellene. A sebezhetőségnek az okai a következők :

  • a bemenő adatot nem ellenőrizzük a szerver vagy a kliens oldalon
  • ha nem jól használjuk a kivételkezelést, akkor a kliensoldalon érzékeny adatok jelenhetnek meg
  • az SQL utasításokat nem ellenőrizzük 


Indítsuk el a VS2012-t és hozzunk létre egy új website-ot (File / New Web Site), amelynek a neve legyen : WebSQLInjection1 (1. ábra).


1. ábra   A tesztkörnyezetünk létrehozása
 

Vegyünk fel a projektünkbe (Add / New Item) egy új Webformot, amelybe vegyünk fel egy nyomógombot (btnBelepes), egy címkét (Label1) és két textbox-ot (txtBoxLogin, txtBoxJelszo). Ha futtatjuk debug módban a weblapunkat, akkor a következő kép (2. ábra) fogad minket.


2. ábra   A weblapunk működése localhost-ban
 

Ezután hozzuk létre a nyomógombhoz tartozó "Click" eseményt, ahova a következő programrészletet írjuk be (3. ábra).


3. ábra   Ez a programrészlet ellenőrzi a login/jelszó helyességét
 

A projektünknek tartalmaznia kell egy adatbázist is, ennek létrehozásáról itt lehet olvasni. Hozzuk létre ezt az adattáblát, amelyet hívjuk "emberek"-nek (4. ábra).


4. ábra   Az emberek adattábla tartalma
 

Az srtSQL string-ben adjuk meg az SQL parancsot, amelyet majd futtatni fogunk. Ha helyes login-t, jelszó párost adunk meg, akkor az Eredmeny változó értéke nagyobb lesz, mint nulla. Ekkor kiírjuk a Label-re, hogy van ilyen felhasználónk, illetve azt is ( Response.Write() ), hogy hány rekordból áll az adattáblánk.

Ha olyan login/jelszó párost adunk meg, amely nem található meg az adatbázisunkban, akkor kiírjuk azt, hogy "Nincs ilyen felhasználó" (5. ábra). (A "tesztelek" felhasználónak nem a "jelszo2" a jelszava.)


5. ábra   Nem jó a login/jelszó páros
 

Írjunk be most egy aposztrófot. Ekkor az srtSQL stringben plusz egy aposztróf jelenik meg, ez futásidőben létrejövő hibát eredményez (6. ábra).


6. ábra   Futási hiba keletkezett, mert az aposztróf módosította a lekérő stringet
 

Az SQL szintaxisban vannak olyan karakterek, amelyeket, ha beírunk, akkor megváltoztatható a SQL stringünk működése. Pl.: ha tudjuk, hogy van egy tesztelek nevű felhasználó, akkor '-- karakterek hozzáírásával nem kell a jelszót beírni (7. ábra).


7. ábra   A '-- karakersorozat eredménye
 

Vegyük észre, hogy a belépésünk sikeres volt, noha nem adtuk meg a tesztelek-hez tartozó jelszót! 
 

Látható tehát az, hogy vannak olyan karakterek, amelyeket nekünk a feldolgozás előtt ki kell vennünk!

De most teszteljünk tovább! Írjuk most be a jelszó helyére a ' or '1' = '1 -et. A lekérésünk most is sikeres volt, az Eredmeny változónk értéke nagyobb lesz, mint nulla (8. ábra).


8. ábra   Sikeres belépés, noha nem adtunk meg loginnevet
 

Ez két példa jól mutatja nekünk, hogy ha a bekért adatokba (login/jelszó) beteszünk speciális karaktereket, akkor az SQL lekérésünk módosítható.

Ezért nekünk ezeket a karaktereket (pl.: a lehetséges aposztrófokat) ki kell szednünk a textbox-okban megadott adatokból, escapelnünk kell. Ha PHP-ban fejlesztünk, használhatjuk például a "mysql_real_escape_string"-et (link).

Ha C# nyelvben fejlesztünk, alkalmazhatjuk a stringeknél a Remove() vagy akár a Replace() metódusokat is.

De használhatunk "Object-Relational Mapping"-et (ORM) is.