| Rubrika Php / mysql
Diskusia k článku
Prihlasovanie uživateľa prostredníctvom $_SESSION
peto
30. 08. 2009, 16:15
ostavbe [a] gmail.com
Neviete niekto prepojit phpbbe3 a wordpress mu na urovni uzivatelov - spolocna registracia a session ?
masko
24. 06. 2009, 02:00
urcite pride na rad aj clanok o problematike bezpecnosti, hlavne tie zakladne problemy ako sql injection a xss treba mat zvladnute.
ixod
20. 06. 2009, 23:22
ixod11 [a] gmail.com
Tak som si pocital nejake info o session (aby som zistil co je to session fixation a hijacking) a niektori autori odporucaju este toto:
&& $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT'])
No a toto potom kontroluju na kazdej stranke spolocne aj s $_SESSION['logged']['Name'].
V kazdom pripade clanocek na prakticku ukazku ochrany proti tymto neduhom by som uvital + nieco o tokenoch.
Dakujem.
ixod
20. 06. 2009, 22:22
ixod11 [a] gmail.com
Jedna otazocka,
preco generujes novu session pomocou session_regenerate_id();,
ked potom do session tak ci tak
pridas meno z tabulky: $_SESSION['logged']['Name'] = $row['Name'];
Ja som si myslel, ze po uspesnom zisteni, ze uzivatel je v tabulke, tak do session pridam nahodne vygenerovany retazec (aby sa nedal uhadnut) a je to. Prosim o nejake vysvetlenie, dik.
naspäť
Pridať komentár
Prihlasovanie uživateľa prostredníctvom $_SESSION
Predpokladom pre prihlasovanie užívateľov do klientskej časti webu je tabuľka, kde budú uložené dáta, pričom nevyhnutnou súčasťou je samozrejme prihlasovacie meno a heslo. Je dobré zapamätať si, že stĺpec tabuľky, ktorý využívame ako prihlasovacie menu by mal mať nad sebou index UNIQUE, ktorý zabezpečí, že v tabuľke nebudeme mať dvoch užívateľov s rovnakým prihlasovacím menom. Viac informácií o tejto problematike som už rozoberal v samostatnom článku, takže sa o tom nebudem viac rozpisovať.
Predpokladajme teda, že máme v MySQL databáze tabuľku s takouto štruktúrou.
| Name | Login | Password | ID |
|---|---|---|---|
| Fero | fero | hashhesla | 1 |
Pochopiteľne v stĺpci password ukladáme heslá užívateľov v nejakom
aspoň minimálne šifrovanom formáte :-). (md5 / sha1).
Ideálne je celý prihlasovací engine zabaliť do nejakej triedy, ktorú si incializujeme hneď v úvode index.php. Mám zabehnutú takúto štruktúru.
<? class login_management { public function loginUser() { } public function logoutUser() { } public function checkUser() { } } ?>
Myslím, že úlohy jednotlivých metód sú jasné z ich názvov. Snáď
len toľko, že metóda checkUser() je uvádzaná v každom
súbore, resp. v súbore index.php, ak predpokladáme, že to je hlavný
súbor, do ktorého sú includované podstránky, na základe napr. URL adresy.
Táto metóda skontroluje či je užívateľ prihlásený alebo nie, prípadne
ak sa užívateľ pokúša vstúpiť na chránenú podstránku, presmeruje ho na
chybovú hlášku – v prípade, že nie je prihlásený.
Poďme teraz k samotnému obsahu metód.
Metóda loginUser()
Metóda slúži na prihlásenie užívateľa – overenie zadaného mena a hesla s menom a heslom uloženým v tabuľke + nastavenie $_SESSION.
<? public function loginUser($login,$password) { // ošetrenie vstupov, vygenerovanie md5 hashu $password = md5($this->safeInput($password)); $login = $this->safeInput($login); // SQL dotaz $sql_user = " SELECT SQL_CALC_FOUND_ROWS * FROM table WHERE login LIKE '" . $login . "' AND password LIKE '" . $password . "' LIMIT 1"; $query = mysql_query($sql_user); // zistenie počtu nájdených riadkov $count = mysql_result(mysql_query("SELECT FOUND_ROWS()"), 0); // ak je väčší než nula, prihlásenie je úspešné if($count>0) { $row = mysql_fetch_assoc($query); // inicializujeme v superglobálnom poli pole 'logged', v ktorom su uložené ďalšie údaje o prihlásenom užívateľovi. // pole záloveň slúži ako identifikátor prihlásenia / neprihlásenia. $_SESSION['logged'] = array(); // pregenerovanie ID session, brani, tzv. session fixation session_regenerate_id(); // nastavime vsetky potrebne udaje o uzivatelovi z tabulky do $_SESSION. $_SESSION['logged']['Name'] = $row['Name']; // unixový timestamp (počet sekúnd od r. 1970) // zaznamenávame si čas prihlásenia, ktorý neskôr kontrolujeme a aktualizujeme pri každej aktivite $_SESSION['logged']['timestamp'] = time(); header("Location: http://presmerujeme_kamkolvek"); exit; // počet riadkov bol rovný nule, takže prihlásenie nebolo úspešné } else { header("Location: http://presmerujeme_kamkolvek"); exit(); } } ?>
Po vykonaní tejto metódy máme užívateľa prihláseného (za predpokladu,
že zadal meno a heslo aké mal…). Jeho prihlásenie overujeme podmienkou
existencie poľa $_SESSION[‚logged‘]:
<? if(is_array($_SESSION['logged'])) { ... } ?>
Metóda checkUser()
V tejto metóde kontrolujeme, či je užívateľ prihlásený alebo nie a zároveň aktualizujeme timestamp. Číslo 1800 v podmienkach znamená, koľko sekúnd môže byť užívateľ neaktívny. Pokiaľ bude neaktívny dlhšie, bude automaticky odhlásený. Metóda je volaná na každej podstránke.
<? public function checkUser() { // užívateľ je prihlásený, ale zároveň, čas poslednej aktivity mínus aktuálny čas // je menší než povolený limit nečinnosti (1800 s = 30 min.) if (isset($_SESSION['logged']['timestamp']) && ($_SESSION['logged']['timestamp'] < time()-1800)) { // užívateľa odhlásime $this->logoutUser(); return false; // užívateľ je prihlásený, funkcia vracia true } elseif(isset($_SESSION['logged']['timestamp'])) { $_SESSION['logged']['timestamp'] = time(); return true; } } ?>
Poslednou nutnou metódou je metóda zabezpečujúca odhlasovanie. Je veľmi
jednoduchá, založená na funkcii unset() alebo
session_destroy(). Pokiaľ použijeme
session_destroy(), zahodíme VŠETKY nastavené $_SESSION, takže
je to na zamyslenie – či ich po odhlásení potrebujeme alebo nie.
<? public function logoutUser() { session_destroy(); // alebo // unset($_SESSION['logged']); header("Location: niekam_presmerujeme"); exit; } ?>
Na záver snáď len toľko, že tu načrtnuté metódy sú len kostrou prihlasovacej triedy, na ktorú sa dajú nabaľovať mnohé prvky.

