Először is leszögezném, hogy nincs általános válasz a kérdésedre, viszont van pár alap tipp, amit érdemes megfogadni.
1. Jelszó tárolás
A jelszó tárolás az első kritikus pontja a rendszerednek. Sok féle adatbázisban tudod tárolni a jelszavaidat, lehet az akár LDAP vagy MySQL, sima szövegfájl. Amire figyelni kell, az a jelszavak megfelelő titkosítása. Ez két dologből tevődik össze. Az egyik maga az egyirányú titkosító algoritmus, pl MD5, SHA1, SHA256, Blowfish, etc. Ezek közül olyat érdemes választani, ami lassú és nincs ismert kriptoanalízis rá (tehát az MD5 kiesett). A második fontos pont az úgynevezett sózás. Ez annyit tesz, hogy nem magát a jelszót hash-eled le, hanem hozzáteszel egy felhasználónként egyedi véletlen generált karaktersorozatot, amit plain textben is eltárolsz. Ennek az a célja, hogy megakadályozza a rainbow table jelszótörést arra az esetre, hogy kikerül az adatbázisod.
2. Beléptetés
Amikor belépteted a felhasználót az oldaladra, alapvetően érdemes a HTTP autentikációt elkerülni, mert ez minden egyes lekérdezésre elküldi a jelszót a szervernek. Ehelyett úgynevezett munkamenetet vagy sessiont érdemes használni. A session úgy működik, hogy a szerver oldalon létrehozol egy adatbázis bejegyzést vagy fájlt, amiben eltárolod az adott munkamenethez kapcsolódó adatokat, például azt, hogy be van-e lépve és ha igen, milyen felhasználónéven. Ezek után kiküldesz egy sütit (cookie-t), ami tartalmazza a session azonosítót. Itt érdemes arra figyelni, hogy ha nem létezik a szerver oldalon a felhasználó által küldött munkamenet azonosító, akkor mindenképpen érdemes újat generálni.
Amellett, hogy az adatbázisok használatánál természetesen vigyázni kell az SQL injection kivédésére, fokozottan kell ügyelni az XSS elleni helyes védelemre is, hiszen egy beillesztett JavaScript kóddal a munkamenet azonosító adott esetben könnyen ellopható.
Érdemes arra is figyelni, hogy a beléptető oldalad kizárólag HTTPS-en legyen elérhető és az megfelelően legyen konfigurálva. Ha a teljes oldal HTTPS-en elérhető, érdemes a sütinél a secure jelzőt és a fejlécekben a HSTS fejléceket beállítani. Emellett a sütiknél mindenképpen érdemes használni a httpOnly jelzőt.
3. Hosszú távú bejelentkezés
Ha olyan funkciót szeretnél beépíteni, mint a Facebook, hogy hosszú távon megjegyzi a böngészőt, akkor erre külön adatbázis bejegyzést kell létrehoznod a felhasználóhoz kapcsolva. Amikor az alkalmazásod meglátja ezt az azonosítót és nincs élő munkamenet, akkor megnézheto, hogy az adott kulcs melyik felhasználóhoz tartozik és automatikusan beléptetheti.
4. Véletlen karaktersorozatok generálása
Volt szó sok féle véletlen karaktersorozatról. Itt érdemes vagy a uniqid() függvényt vagy az openssl_random_pseudo_bytes() függvényt használni és a saját hákolásokat elkerülni.
5. Általános jótanácsok
Ha PHP-s alkalmazást gyártasz, érdemes a 10 évvel ezelőtti praktikákat és tévhiedelmeket elfelejteni. Mostanában már egy modern PHP-s alkalmazás OOP szemlélettel épül fel és megfelelően központosítja az adatbázis-kezelést valamint a beléptetést. Ez csökkenti a hibalehetőségeket és növeli a hatékonyságot. Erről bővebben a blogomon olvashatsz.
Remélem, segítettem. Ha valamivel kapcsolatban kérdésed van, állok rendelkezésedre.
--
Pásztor János
Üzemeltető Macik