Az adatbázisok biztonsága

Az adatbáziskezelők különböznek egymástól, de alapvető dolgokat a használatuk során figyelembe kell venni.

  • Az adatbázis használatbavételekor arra kell ügyelni, hogy a PHP kód sohase root vagy admin jogú felhasználóként használja az adatbázist, ugyanis ilyenkor az adatbáziskezelő képes fájlokat is létrehozni a szerveren. (Sajons a múltban volt ilyen szomorú tapasztalatom.
  • Hacsak lehetséges ne teljes SQL utasításokat küldj át a szervernek, hanem view-k (nézet), triggerek és rule-ok segítségével old meg az adatbázis módosítását, a megjelenítést. Ezzel nem csak biztonságosabb lesz a rendszer, hanem egyúttal az alkalmazás oldalról átkerül a szerver oldalra is némi feladat, ami a teljesítmény szempontjából sem utolsó dolog.
  • Az adatbázisban soha ne tárolj jelszavakat nyílt szövegként! Még akkor sem, ha a titkosítás bonyolult lenne. Inkább tárold az md5() vagy a crypt() függvénnyel tárolt hash értéket. Ez ugyan azt eredményezi, hogyha a user elfelejti a jelszavát, akkor újat kell neki adni, dehát ne felejtse el.
  • Ha távolról kell felügyelni egy adatbázist valamilyen általános kliens alkalmazással, például phpmyadmin-nal, akkor ott is használj erős jelszavakat a titkosításhoz és lehetőleg ne a default beállításokat használd.
  • Figyelj arra, hogy az url-ekben ne legyenek az adatbázisra utaló táblanevek még paraméterként sem.
  • A kliens oldalról ne küldj át sql utasítást url-ben
  • A kliens oldalról elküldött paraméterek lehetőleg ne GET metódussal kerüljenek át a szerverhez, mivel a böngészőben később ezek visszanézhetők.
  • Hacsak lehetséges használj https:// protokollt.
  • Az SQL injection csúnya dolog. A módszer lényege az, hogy az oldaladról elküldött GET vagy POST utasítást gyakran a szerver oldalon SQL utasítások összeállítására használják. Ha a programozó nem elég körültekint?, akkor a bevitt paraméterek segítségével az eredeti SQL utasítást végzetesen módosíthatja.

$sql = "SeleCT id, username FROM user WHERE usename= '".$_GET["name"]."';";

Ez az SQL utasítás elvileg csak egy user adatait éri el, de ha az alábbi paramétert küldünk el a szervernek, akkor a teljes listát megjelenítheti a szerver oldal.

$_GET["name"] = "' OR 1 =1 '"

Hasonló problémát okozhat, ha a szerver az UNION sql utasítást engedélyezi, akkor az eredeti lekérdezés bármit kiirathat.
Probléma lehet abból is, ha hibás SQL utasítást küldünk a szervernek, ami a futás közben hibaüzenetet ad vissza.