(Обратите внимание, что хотя этот метод все еще в некоторой степени действителен; образцы PHP не следует копировать дословно, поскольку существуют более безопасные способы включения пользовательских значений в запрос SQL)
Вместо того, чтобы хранить, активен ли пользователь \ неактивен, лучше хранить некоторый атрибут, который может быть проверен против пользователя для каждого отдельного действия; например, каждый раз, когда пользователь пытается выполнить что-то, требующее аутентификации, он проверяет, совпадает ли этот атрибут, прежде чем он продолжит работу.
Я рекомендую вам сделать следующее;
Во-первых, создайте хеш для уникальной идентификации пользователя при каждом входе в систему. Я думаю, что sha1
из time()
будет достаточно, чтобы избежать коллизий. Что бы вы ни выбрали, убедитесь, что он достаточно разнообразен, чтобы другой пользователь, вошедший в систему, имел невероятно низкий шанс получить тот же хеш (например, не хэшируйте IP-адрес или пользовательский агент браузера, поскольку они не меняются). достаточно).
Во-вторых, сохраните этот хеш в своей базе данных и в пользовательском сеансе во время входа в систему. Это позволит эффективно «выйти» из системы предыдущего пользователя, поскольку хэш должен каждый раз отличаться вход в систему.
Поскольку мы используем сеансы, в браузер пользователя должен автоматически помещаться файл cookie, который будет содержать уникальный идентификатор, который идентифицирует пользователя по его или ее данным сеанса. Содержимое файла cookie не имеет значения.
Затем создайте функцию с именем authenticateUser()
или аналогичную, которая будет вызываться в начале каждого сценария для проверки подлинности пользователя. Этот сценарий должен запрашивать базу данных, проверяя, есть ли у пользователя с идентификатором вашего пользователя хеш, соответствующий хешу вашего пользователя.
Например:
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;
}
}
Затем мы просто передаем authenticateUser()
пользователя ID
, hash
(для данных вашего сеанса) и database link
(для соединения с базой данных, которое вам придется открыть ранее).
Если authenticateUser()
возвращает true
, пользователь проходит проверку подлинности. Если false
, пользователь не ИЛИ база данных недоступна или возникла ошибка SQL.
Обратите внимание, что это увеличит нагрузку на ваш сервер, так как запрос к базе данных отправляется один раз на запрос страницы Вероятно, не все так мудро делать это в гигантских проектах, в которые тысячи людей входят в систему в любой момент времени. Я уверен, что кто-то может предложить улучшения.
Кроме того, ожидание истечения срока действия файла cookie не лучший способ заставить людей, которые были неактивны, выходить из системы, поскольку вы никогда не должны доверять файлам cookie. Вместо этого вы можете добавить столбец с именем last_active
, который можно обновлять каждый раз при аутентификации пользователя. Это также увеличит нагрузку на сервер, но позволит вам вручную отменить устаревшие входы в систему, удалив hash
для пользователей, которые были, скажем, неактивны в течение 3 часов.