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.