Zend Framework Запомнить меня - рабочая проблема - PullRequest
1 голос
/ 12 марта 2012

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

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

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

Поскольку он настроен на пребывание в системе, он получает свою сессию, и он может опубликовать историю и делать что угодно в своем аккаунте беззная тот факт, что его аккаунт был удален в предыдущий день.Также я запомнил на 14 дней.

Есть идеи, как решить эту проблему?

Спасибо

Ответы [ 6 ]

3 голосов
/ 13 марта 2012

Продление срока действия сеанса более чем на несколько часов является плохой идеей по многим причинам, а не только потому, что вы ведете сеансы удаленных пользователей.Также существуют проблемы с производительностью и безопасностью, связанные с тем, что вы сохраняете активный сеанс (с идентификатором сеанса) в своей базе данных / хранилище сеансов.

См. постоянный вход в систему с Zend_Session :: запомнитьMe .

В любом случае вы должны повторно проверять свою учетную запись пользователя при каждой загрузке страницы, чтобы убедиться, что его пользователь все еще существует и активен:

Я создал функцию повторной проверки, которую я вызываю при каждой загрузке страницы,Функция вызывается из функции 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;
    }
2 голосов
/ 12 марта 2012

Поскольку он настроил пребывание вошедшим в систему, он получает свою сессию, и он может опубликовать историю и делать что-либо в своей учетной записи, не зная, что его учетная запись была удалена в предыдущий день.

При удалении пользователя необходимо также удалить все сеансы пользователя.

1 голос
/ 12 марта 2012

В вашей таблице SESSIONS в базе данных используйте внешний ключ для таблицы USERS с ON DELETE CASCADE. Или вы можете выполнить JOIN для пользовательской таблицы при получении сеанса.

0 голосов
/ 12 марта 2012

Вы можете проверить только то, что проверяете.В момент окончания сеанса и удаления пользователя и запуска процедуры постоянного входа в систему для сохранения входа пользователя в систему необходимо убедиться, что пользователь все еще существует.- hakre

как сказал hakre, я думаю, что вы должны проверять пользователя каждый раз, когда он пытается изменить настройки или делать что-то вроде отправки нового сообщения или публикации нового комментария и т. Д. Давайте попробуем это

0 голосов
/ 12 марта 2012

Когда пользователь покидает свой компьютер и возвращается на ваш сайт на следующий день, его сеанс давно истек.На этом этапе, если вы разрешаете ему доступ к вашему веб-сайту, это происходит потому, что он решил запомнить, что вы делаете, устанавливая файлы cookie на компьютере.

Когда вы аутентифицируете пользователя на основе файлов cookie, вы ДОЛЖЕН проверить значения файлов cookie в базе данных. Не проверяйте наличие cookie .

. Это исправит вашу проблему.Кроме того, он закроет большую дыру в безопасности, где злоумышленник может просто вручную создать файлы cookie на своем компьютере и использовать их для проверки подлинности вашего веб-сайта.

0 голосов
/ 12 марта 2012

Это ровно , почему вам нужно установить время ожидания сеанса для каждого приложения / страницы.

Используйте ini_set(), чтобы время жизни сеанса

ini_set("session.cookie_lifetime","1800"); //half an hour

Затем проверьте, активен ли сеанс на каждой защищенной странице, например

if (!empty(session_id())) {
    header("Location: index.php"); //GO to home page
    exit;
}
...