Zend Framework Запомнить меня - рабочая проблема

Я использовал функцию "Помни меня" на своем сайте, используя следующий пакет: http://www.jasperrooswinkel.com/unexpected-expiration-of-zend_auth-sessions/. Работает нормально. Но я сталкиваюсь с проблемой, что удаленный пользователь может получить доступ к учетным записям только из-за того, что остается в системе.

Сценарий таков:

  1. Вход пользователя в систему после настройки оставьте меня в системе.
  2. Он оставил систему выключенной без выхода из системы.
  3. Его аккаунт был удален в тот же вечер.
  4. Он берет сайт на следующий день утром.

Поскольку он настроен на пребывание в системе, он получает свою сессию, и он может опубликовать историю и делать что-либо в своем аккаунте, не зная, что его аккаунт был удален в предыдущий день. Также я запомнил на 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;
}
Другие вопросы по тегам