Witam, dotychczas do logowania użytkowników stosowałem "gołe" sesje z PHP, ale po uświadomieniu sobie bezpieczeństwa takiego rozwiązania, postanowiłem jak najszybciej to zmienić. Przekopałem sporo informacji na ten temat i chyba najlepszym rozwiązaniem jest zrobienie własnego mechanizmu sesji opartego o bazę danych. Niestety, ile ludzi tyle zdań jak to ma konkretnie wyglądać aby było bezpieczne (a przynajmniej bezpieczniejsze niż natywne sesje) i już sam nie wiem, czy dobrze rozumiem problem, dlatego prosiłbym Was o sprawdzenie mojego prostego rozwiązania. Do rzeczy. W bazie danych tworzę nową tabelę 'sessions' o następującej strukturze:
session_id | user_id | browser | expiration |
---|---|---|---|
'expiration' to data i czas wygaśnięcia sesji (standardowo 1 godzina, chyba że użytkownik zaznaczy autologowanie). | |||
Jeżeli użytkownik prawidłowo wpisał swój login i hasło, za pomocą polecenia md5(time()) generowany jest identyfikator sesji który, oprócz do bazy, wstawiany jest także do ciastka. Data wygaśnięcia tego ciastka jest oczywiście taka sama, jak przypisanej do niego sesji. Do sprawdzania czy użytkownik jest zalogowany stosuję tego typu funkcję (zabieram się do tej obiektówki "jak pies do jeża"): |
function islogged()
{
global $dbc; //połączenie z bazą
if (isset($_COOKIE['logged']))
{
$sql = mysqli_query($dbc, "SELECT user_id FROM sessions WHERE session_id='$_COOKIE[logged]' AND browser='$_SERVER[HTTP_USER_AGENT]'");
$row = mysqli_fetch_array($sql);
if (!empty($row))
return $row['user_id'];
}
return 0;
}
Czy to rozwiązanie ma w ogóle sens i jest w miarę bezpieczne?