8.16 - Az adatbázisok biztonsága

Az alábbi tanácsok elsődlegesen WEB-es alkalmazásokra vonatkoznak.

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. (Sajnos 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, de ne felejtse el. Ha mégis elfelejti, akkor küldj neki egy valamennyi ideig érvényes egyszeri linket, amivel be tudja állítani az új jelszót.

  • 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 a name paraméternél az alábbi paramétert küldjük el a szervernek, akkor a teljes listát megjelenítheti a szerver oldal.

https://valami.hu?name=\"valami\" 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 kiírathat. 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.