PHP - SQL injekció


Mi az SQL injekció?

Az SQL injekció (SQL injection) az egyik legegyszerűbb módja annak, hogy emberek vagy akár programok jussanak hozzá adatbázisban tárolt adatainkhoz vagy rosszabb esetben akár törölhetik is azokat. A legtöbb esetben egy egyszerű beviteli mezőbe írt SQL paranccsal történik mindez. 

Példák

Itt van egy egyszerű SQL, ami mondjuk lehetne egy bejelentkező felülethez tartozó lekérdezés is:

SELECT * FROM users WHERE user_name='...';

Na most, ha pontok helyére egy változóba pakolt GET vagy POST metódussal átküldött űrlapadatokat teszünk, akkor az SQL lefut és a keresi feltételnek megfelelően például:

SELECT * FROM users WHERE user_name='admin';

Szövegként beilleszkednek a változók értékei, az SQL lefut és visszaadja az eredményhalmazt. A probléma akkor van, ha nem sima szöveg érkezik, hanem az adatbázis motor által értelmezhető SQL parancsok. 

Lássunk egy példát, ha mondjuk a beviteli mezőbe ezt írjuk:

' OR id > 0#

Akkor az SQL így néz ki:

SELECT * FROM users WHERE user_name='' OR id > 0#';

A # jel után az értelmezés megszakad és ha van id tulajdonsága az táblának, akkor eredményhalmaznak visszakapjuk az összes rekordot, ahol az id nagyobb, mint 0. Amennyiben a bejelentkező felületen csak ennyi feltétel lett volna, akkor már be is jelentkeztünk.

Következő példa:

' OR 1 = 1#

Az 1 = 1 mindig igaz. Ez még hatékonyabb, mert nem kell tudni vagy feltételezni bármely tulajdonság létezését.

Agresszív példa:

' OR 1 = 1; DELETE * FROM users; #

Két parancs futtatása történik. Amennyiben van users tábla, kitörli annak tartalmát.

Ezeken kívül még nagyon sok minden beírható okozva nagyobbnál-nagyobb problémákat pl.:

  • adatbázis motor függvények
  • information_schema (MySQL) 



Védekezés ellene

Talán a legjobb védekezés, ha PHP-PDO-t használunk és azon belül is előkészített lekérdezéseket írunk és paraméterként adjuk át az adatokat. Ez utóbbit MySQL esetén mysqli objektummal is megtehetjük.

Léteznek PHP "szövegátalakító" függvények is, valamint szinte minden adatbázis motor rendelkezik beépített megoldásokkal.

Megjegyzések