Zamiast zapisywać, czy użytkownik jest aktywny \ nieaktywny, lepiej jest przechowywać pewne atrybuty, które mogą być sprawdzane dla użytkownika na podstawie działania; podczas gdy za każdym razem, gdy użytkownik próbuje zrobić coś, co wymaga uwierzytelnienia, sprawdza, czy ten atrybut jest zgodny, zanim zacznie działać.
Polecam wykonać następujące czynności;
Najpierw utwórz skrót, aby jednoznacznie zidentyfikować użytkownika przy każdym logowaniu. Wyobrażam sobie, że wystarczy sha1
z time()
, aby uniknąć kolizji.Bez względu na to, co wybierzesz, upewnij się, że jest wystarczająco zróżnicowany, aby inny użytkownik logujący się miał niewiarygodnie niskie szanse na otrzymanie tego samego skrótu (na przykład, nie mieszając adresu IP lub przeglądarki użytkownika, ponieważ nie są one różne dość).
Po drugie, nie przechowuj wartości mieszania w bazie danych oraz w instrukcji session w momencie logowania. Robi to skutecznie będzie „wylogowanie” poprzedniego użytkownika, jak hash powinna być inna za każdym razem ktoś loguje się.
Ponieważ używamy sesji, plik cookie powinien automatycznie zostać umieszczony w przeglądarce użytkownika, który będzie zawierał unikatowy identyfikator identyfikujący użytkownika do jego danych sesji. Zawartość pliku cookie nie stanowi problemu.
Następnie należy utworzyć funkcję o nazwie authenticateUser()
lub podobną, która będzie wywoływana na początku każdego skryptu, aby zapewnić uwierzytelnienie użytkownika. Ten skrypt powinien wysłać zapytanie do bazy danych, sprawdzając, czy użytkownik z identyfikatorem użytkownika ma skrót, który jest zgodny z hashem użytkownika.
Na przykład:
function authenticateUser($id, $hash, $databaseLink) {
# SQL
$sql = 'SELECT EXISTS(
SELECT 1
FROM `tbl_users`
WHERE `id` = \''.mysql_real_escape_string($id).'\'
AND `hash` = \''.mysql_real_escape_string($hash).'\'
LIMIT 1
);';
# Run Query
if ($query = mysql_query($sql, $databaseLink)) {
# Get the first row of the results
# Assuming 'id' is your primary key, there
# should only ever be one row anyway.
$result = mysql_fetch_row($query);
# Casting to boolean isn't strictly necessary here
# its included to indicate the mysql result should
# only ever been 1 or 0.
return (bool)($result[0]);
} else {
# Query error :(
return false;
}
}
Następnie, po prostu przejść authenticateUser()
użytkownikowi na ID
, hash
(za swoich danych sesyjnych) i database link
(dla połączenia z bazą danych będzie trzeba mieć otwarte wcześniej).
Jeśli authenticateUser()
wróci true
, użytkownik zostanie uwierzytelniony. Jeśli false
, użytkownik nie jest LUB baza danych jest niedostępna lub jest błąd SQL.
Należy jednak pamiętać, że zwiększy to obciążenie serwera, ponieważ żądanie bazy danych jest wysyłane raz na żądanie strony. Prawdopodobnie nie jest to mądre, aby zrobić to w gigantycznych projektach, w których tysiące osób loguje się w danym momencie. Jestem pewien, że ktoś może sugerować ulepszenia.
Również czekanie na wygaśnięcie pliku cookie nie jest najlepszym sposobem zmuszenia osób nieaktywnych do wylogowania się, ponieważ nigdy nie należy ufać ciasteczkom. Zamiast tego możesz dodać kolumnę o nazwie last_active
, którą możesz zaktualizować za każdym razem, gdy użytkownik jest uwierzytelniany. Spowoduje to również zwiększenie obciążenia serwera, ale pozwoli na ręczne zastąpienie nieaktualnych logowań przez usunięcie hash
dla użytkowników, którzy byli, powiedzmy, nieaktywni przez 3 godziny.
Właściwy bit tego pytania ("jak mogę wylogować użytkowników, którzy stają się nieaktywni?"), Został tu wcześniej zapytany (patrz http://stackoverflow.com/questions/247412/) –