ugrás a tartalomhoz

Felhasználó azonosítás - Alapszintű biztonság

whiteman0524 · 2009. Nov. 21. (Szo), 00.15
Ü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 :

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();
  }
}
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 :)
 
1

indulásnak

gex · 2009. Nov. 21. (Szo), 01.37
3

Ezt a cikket mindenképp elolvasom :)

whiteman0524 · 2009. Nov. 21. (Szo), 15.36
Köszönöm a linket :)
2

lejárati idő, jelszó tárolása

Szekeres Gergő · 2009. Nov. 21. (Szo), 13.03
a lejárati időt nem sessionben szokták ellenőrizni, hanem alacsonyabb szinten vagy cookiek eldobásával, vagy a session törlésével.

a user jelszavát pedig sosem tároljuk, általában vagy egy user objektumot érdemes sessionbe menteni, vagy csak egy user id-t.
4

Aláhúzandó

Joó Ádám · 2009. Nov. 21. (Szo), 18.11
Csak kihangsúlyozandó Gergő mondanivalóját: a jelszó eltárolásával nemhogy nem nyersz semmit, de növeled a biztonsági kockázatot.
5

Értem...

whiteman0524 · 2009. Nov. 22. (V), 12.41
Már csak azt nem értem hogy az eltárolandó felhasználó aznosító tehát például az id alatt mit értetek ? Azt az id-t amit a MYSQL-ben kap, vagy valami egyedi karakterláncot ? Mert egy integernek nem sok értelme lenne...
7

Mi azonosítja a felhasználót?

vbence · 2009. Nov. 22. (V), 16.08
Mi azonosítja a felhasználót? Hogyan hivatkozol rá? Ha egy felhasználó ír egy fórumbejegyzést, akkor a bejegyzés rekordjában egy "integer" azonosítja a felhasználót? Akkor egy integert célszerű tárolni a sessionben. Vagy minden bejegyzésben szerepel a felhasználó login neve neve? Akkor azt.

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:
select * from user where id='132'
... erre viszont az oldalad más részein valószínűleg amúgy is szükség lesz.

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.
9

Igen,,

whiteman0524 · 2009. Nov. 22. (V), 22.29
Természetesen egy id azonosítja a felhasználót, mégpedig az amit regisztrálásnál kap. De azt hiszem most már leesett a dolog :)
6

Azonosító

Joó Ádám · 2009. Nov. 22. (V), 16.08
Miért ne volna értelme a numerikus id-t eltárolni, ha az elsődleges kulcs? Az adatbázison belül (és épp ezért kívül is) azzal azonosítod a felhasználód. Ha például belépés után el kell döntsd, hogy jogosult-e egy oldal megtekintésére, akkor futtatsz egy lekérdezést ezzel az azonosítóval a jogosultságokat tároló táblában. Ha meg akarod jeleníteni az által írt bejegyzéseket, akkor a bejegyzések táblában keresel vele, sí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).
8

Plusz

gphilip · 2009. Nov. 22. (V), 19.31
Hali!

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.
10

Megfogadom ...

whiteman0524 · 2009. Nov. 22. (V), 22.37
...a tanácsaidat, és köszönöm szépen őket. De azzal kapcsolatban amit írtál eszembe jutott mg egy támadási módszer, ez pedig az elárasztás. Amikor kérelmekkel árasztják el a szervert és mivel az nagyon el van foglalva a teljesítésükkel, ezért megbénulhat, lelassulhat vagy össze is omolhat. Nyilván nem valószínű hogy ez engem különösebben fenyegetne, de sose lehet tudni, és ha már itt tartunk akkor erre is rákérdeznék, hiszen ez valamennyire kapcsolódik az időlimites azonosításhoz.

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 :)
11

DOS

Joó Ádám · 2009. Nov. 22. (V), 22.45
Denial of Service, olvass utána.