Felhasználó azonosítás - Alapszintű biztonság
Üdv !
Ennél jobb címet sajnos nem igazán tudtam kitalálni :) Tehát most konkrét tapasztalatokra lennék kíváncsi a felhasználó azonosítás terén. Nekem eddig ez volt a "jól bevált" és nem túl bonyolult módszerem :
1. Sikeres Bejelentkezésnél session_start(); indítása, majd a felhasználónév - jelszó páros és az aktuális idő tárolása mondjuk a $_SESSION['name'], $_SESSION['pass'], és a $_SESSION['time'] változóban.
2. Minden egyes tevékenységnél, tehát ami az oldal frissítésével jár meghívódik például a következő függvény vagy valami ilyesmi :3. És akkor ennyi...lenne...
Biztosan irtó gyenge megoldás, és legalább 236987 sebből vérzik ezért érdekelne hogy hogyan kéne ezt szakszerűbben csinálni, (feltételezve hogy lehet jobban is) ? :)
A válaszokat előre is köszönöm :)
■ Ennél jobb címet sajnos nem igazán tudtam kitalálni :) Tehát most konkrét tapasztalatokra lennék kíváncsi a felhasználó azonosítás terén. Nekem eddig ez volt a "jól bevált" és nem túl bonyolult módszerem :
1. Sikeres Bejelentkezésnél session_start(); indítása, majd a felhasználónév - jelszó páros és az aktuális idő tárolása mondjuk a $_SESSION['name'], $_SESSION['pass'], és a $_SESSION['time'] változóban.
2. Minden egyes tevékenységnél, tehát ami az oldal frissítésével jár meghívódik például a következő függvény vagy valami ilyesmi :
function loginValidate(){
session_start();
// Ha léteznek a változók...
if(isset($_SESSION['name']) && isset($_SESSION['pass']) && isset($_SESSION['time'])){
// Ha létezik a felhasználónév - jelszó páros és nem járt még le a 10 perc...
if(ifUser($_SESSION['name'], $_SESSION['pass']) && (time() - $_SESSION['time'] < 600)){
// Akkor az idő frissítése és az id újragenerálása hogy kicsit biztonságosabb legyen
$_SESSION['time'] = time();
session_regenerate_id();
} else {
// Különben destroy, és mehet vissza a bejelentkezéshez
session_destroy();
header('Location: login.php');
exit();
}
} else {
// Különben mehet vissza a bejelentkezéshez
header('Location: login.php');
exit();
}
}
Biztosan irtó gyenge megoldás, és legalább 236987 sebből vérzik ezért érdekelne hogy hogyan kéne ezt szakszerűbben csinálni, (feltételezve hogy lehet jobban is) ? :)
A válaszokat előre is köszönöm :)
indulásnak
Ezt a cikket mindenképp elolvasom :)
lejárati idő, jelszó tárolása
a user jelszavát pedig sosem tároljuk, általában vagy egy user objektumot érdemes sessionbe menteni, vagy csak egy user id-t.
Aláhúzandó
Értem...
Mi azonosítja a felhasználót?
Ha azért tárolod, a user nevét a sessionben, hogy az oldal tetjére kiírd: "Hello, pisti23", akkor rosszul teszed. Ez cache-elés, és nem az azonosítás vagy munkamenetkezelés feladata. Vagyis megspórolsz vele egy ilyet:
A jelszó tárolása a munkamenetben teljesen fölösleges, ugyanis ezt eleve sikeres beléptetéskor töltöd fel. Tehát ha létezik a $_SESSION["user"] az már garantálja, hogy a user átment egy sikeres azonosításon.
Igen,,
Azonosító
Emellett persze érdemes a sűrűn használt egyéb adatokat is eltárolni, pl. ha minden oldalon megjeleníted a felhasználónevét, akkor azt hiba volna mindig újra lekérdezni. A jelszót azonban úgysem használod semmire, azt ne tárold (és az adatbázisban is hashelve, saltolva tárold).
Plusz
A témához annyi tennék még hozzá, hogy
- érdemes mindig ellenőrizni az utolsó sikertelen belépés idejét, és kivédeni a brute-frce támadást így. Többféle megoldás van erre, de pl ha csak 3 mp-enként engeded az aonosíást, akkor nem tévedhetsz nagyot.
- a PHP alap sessionkezelése elvégzi a session kinyírását amikor itt az ideje, ezt em kell kézzel végezned. Mellesleg sok esetben nem csak a belépett usernek célszerű sessiont fenntartnai, hanem az azonosítatlannak is.
Megfogadom ...
Tehát az elárasztás ellen hogyan lehet védekezni ? Minden bizonnyal ezt már megint rosszul gondolom ahogy lenni szokott, de bármilyen jellegű kapcsolat felvétel a szerverrel az valamilyen szintű terhelésnek teszi ki azt, mivel ekkor kommunikálnia kell. Tehát ha nagy erőkkel például csak egyszerűen állandóan frissítenek egy lapot, attól is kiakadhat. Persze ezt csak én gondolom így... Semmire se alapozok :)
DOS