Zend Framework Запомнить меня - рабочая проблема
Я использовал функцию "Помни меня" на своем сайте, используя следующий пакет: http://www.jasperrooswinkel.com/unexpected-expiration-of-zend_auth-sessions/. Работает нормально. Но я сталкиваюсь с проблемой, что удаленный пользователь может получить доступ к учетным записям только из-за того, что остается в системе.
Сценарий таков:
- Вход пользователя в систему после настройки оставьте меня в системе.
- Он оставил систему выключенной без выхода из системы.
- Его аккаунт был удален в тот же вечер.
- Он берет сайт на следующий день утром.
Поскольку он настроен на пребывание в системе, он получает свою сессию, и он может опубликовать историю и делать что-либо в своем аккаунте, не зная, что его аккаунт был удален в предыдущий день. Также я запомнил на 14 дней.
Есть идеи, как решить эту проблему?
Спасибо
6 ответов
Продление срока действия сессии более чем на несколько часов - плохая идея по многим причинам, а не только потому, что вы ведете сеансы удаленных пользователей. Есть также проблемы с производительностью и безопасностью, связанные с тем, что вы сохраняете активный сеанс (с идентификатором сеанса) в своей базе данных / хранилище сеансов.
Смотрите постоянный вход в систему с Zend_Session:: запомнить Me.
В любом случае вы должны повторно проверять свою учетную запись пользователя при каждой загрузке страницы, чтобы убедиться, что его пользователь все еще существует и активен:
Я создал функцию revalidate, которую я вызываю при каждой загрузке страницы. Функция вызывается из функции init() контроллера, прежде чем пользователь сможет что-либо сделать.
public static function revalidate() {
$userData = self::getIdentity();
$modelUsers = new \Model_Users();
$user = $modelUsers->fetchWithEmail($userData['email']);
if ($user instanceof \Model_User) {
if ($user->getRoleType() == 'ACCOUNT') {
return $user;
}
}
return false;
}
Поскольку он настроен на пребывание в системе, он получает свою сессию, и он может опубликовать историю и делать что-либо в своем аккаунте, не зная, что его аккаунт был удален в предыдущий день.
Когда вы удаляете пользователя, вы должны также удалить все сеансы пользователя.
В вашей таблице SESSIONS в базе данных используйте внешний ключ для таблицы USERS с ON DELETE CASCADE. Или вы можете выполнить JOIN для пользовательской таблицы при получении сеанса.
Когда пользователь покидает свой компьютер и возвращается на ваш сайт на следующий день, его сеанс давно истек. На этом этапе, если вы разрешаете ему доступ к вашему веб-сайту, это происходит потому, что он решил запомнить, что вы делаете, устанавливая куки на компьютере.
Когда вы аутентифицируете пользователя на основе куки, вы ДОЛЖНЫ проверять значения куки в базе данных. Не проверяйте наличие куки.
Это исправит вашу проблему. Кроме того, он закроет большую дыру в безопасности, где злоумышленник может просто вручную создать файлы cookie на своем компьютере и использовать их для аутентификации вашего веб-сайта.
Вы можете проверить только то, что проверяете. В момент окончания сеанса и удаления пользователя и запуска процедуры постоянного входа в систему для сохранения входа пользователя в систему необходимо убедиться, что пользователь все еще существует. - хакре
Как сказал Хакре, я думаю, что вы должны проверять пользователя каждый раз, когда он пытается изменить настройки или делать что-то вроде отправки нового сообщения или публикации нового комментария и т. д. Давайте попробуем это
Именно поэтому вам нужно установить время ожидания сеанса для каждого приложения / страницы.
использование ini_set()
Время жизни сессии
ini_set("session.cookie_lifetime","1800"); //half an hour
Затем проверьте, жив ли сеанс на каждой защищенной странице, например
if (!empty(session_id())) {
header("Location: index.php"); //GO to home page
exit;
}