Вы можете найти множество учебных пособий по настройке систем проверки подлинности сервера, но вот короткий ответ. Для производственного использования вместо обучения лучшим ответом обычно является использование существующей библиотеки или фреймворка, которые были протестированы другими людьми.
Вместо того, чтобы устанавливать «онлайн» в базе данных, генерируйте какое-то уникальное значение. (Один быстрый и, вероятно, не очень безопасный способ: md5 га sh текущего времени сервера + идентификатор пользователя + некоторый секрет)
Установите это значение как поваренное значение ie в браузере пользователя вместе с идентификатор пользователя.
Сохраните это значение в качестве текущего поля сеанса в базе данных.
Вместо проверки "онлайн" в базе данных убедитесь, что в браузере есть идентификатор пользователя и идентификатор сеанса ie комплект. Найдите идентификатор текущей сессии для идентификатора пользователя в базе данных и посмотрите, совпадают ли они. Если нет, покажите «сеанс истек» и страницу входа в систему.
SQL инъекция: очистите входы и используйте хранимую процедуру или безопасную библиотеку, которая защищает от «маленьких таблиц Бобби», где они помещают команды в Идентификационные или сеансовые куки.
Подробнее:
Если браузер зайдет на вашу страницу, у него будет один из следующих вариантов:
- без куки: просто показать страницу входа
- идентификатор пользователя cook ie, идентификатор сессии cook ie: проверить, если он действителен, то обрабатывать его как зарегистрированного
Когда пользователь входит в систему, вы устанавливаете идентификатор пользователя и ID сессии Cook ie и ОБНОВЛЕНИЕ базы данных. Поскольку это единственный раз, когда вы устанавливаете идентификатор сеанса cook ie, ни один другой человек или браузер никогда не входят в систему одновременно.
Проверка:
Для проверки вы можете сделать безопасный SELECT или хранимая процедура с использованием идентификатора пользователя и идентификатора сеанса. Например (это PHP PDO, а не Python)
SELECT SessionID FROM LoginTable WHERE UserID = ? LIMIT 1;
Если (SessionID == идентификатор сессии cook ie), то они вошли в систему. Каждая страница, которую вы хотите защитить, должна отметьте это.
База данных
UserID UserNmae SessionID
1234 Fred 1234abcd1234abcd...
1235 Barney null
1236 Wilma 7fe0320a....
SessionID изменяется каждый раз, когда пользователь успешно входит в систему, поскольку сервер генерирует новое значение и сохраняет его в базе данных и в заголовках страницы ответа для успешный вход
Так что, если Уильма имеет открытые Firefox и Chrome и войдет в систему с Firefox, он получит сеансового повара ie из "7fe0320a ...." и войдет в систему.
Но Chrome НЕ будет иметь этого повара ie, поэтому он получит страницу входа. Если затем Вильма входит в систему с Chrome, строка SessionID базы данных изменится на «abcd0f03 ...», и Chrome будет задано, что в качестве сеанса готовится ie.
Теперь Firefox все еще "7fe0320a ...." cook ie, но этот cook ie не соответствует базе данных, в которой теперь есть "abcd0f03 ...". Он недействителен, поэтому Firefox получает страницу входа и должен войти снова.