Сессия, показывающая резкое поведение

В моем сеансе php отображается аберрантное поведение. Ситуация:

  • Пользователь регистрируется в (https://example.com) приложении
  • Срок действия cookie сеанса установлен на 7 дней. (Проверено на время работы браузера cookie)
  • Пользователь переходит в другой домен (без https)
  • Когда пользователь пытается вернуться через некоторое время, щелкнув ссылку приложения, сеанс будет уничтожен.
  • Поведение резко. Иногда он остается действительным.

Вот как я запускаю сеанс:

if(!$this->session_manager_issession_set()) {
            $this->set_ini_config();
            session_name($this->session_manager_name);
            session_set_cookie_params($this->session_cookie_life, "/"); //Required for browser cookie cleanup
}

session_start();

if(empty($_SESSION))
    {
        $output['status']   =   false;
    }
    else{
       // Fetch the variables
    }

public function session_manager_issession_set(){
        $output =   true;

        $session_status =   session_status();
        switch($session_status){
            case PHP_SESSION_ACTIVE :

            break;
            default:
                $output =   false;
        }

        return $output;
    }

private function set_ini_config(){
    $output =   true;

    ini_set('session.gc_probability', 1);   //If session expires then ensure that session is flushed and cleared at all instances
    ini_set('session.gc_divisor', 100);     //If session expires then ensure that session is flushed and cleared at all instances

    ini_set('session.gc_maxlifetime', 7*24*60*60);  //MAx life of session cookie
    ini_set('session.cookie_secure', true);

    return $output;
}

Что может быть причиной этого? Не удалось ли я выполнить сеанс неверно?

Ответ 1

Прежде всего, ваша функция session_manager_issession_set() в основном проверяет, не запущен ли сеанс (session_status() != PHP_SESSION_ACTIVE), но затем вы начинаете сеанс, игнорируя тот факт, что сеанс мог быть запущен.

Если для вас важно имя сеанса, вы должны обеспечить его соблюдение:

if ($this->session_manager_issession_set()) {
    // session has already started, but we haven't set a name for it!
    throw new Exception("Session started prematurely");
}

// all fine, session isn't running; continue with setup
$this->set_ini_config();
session_name($this->session_manager_name);
session_set_cookie_params($this->session_cookie_life, "/");
// and finally start the session
session_start();

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

Другой вариант - сохранить весь код и удалить только одну строку с помощью

session_name($this->session_manager_name); 

Если это помогает, тогда я должен быть прав.

Ответ 2

Перед проверкой любых параметров проверки сеанса, начните с основ, например, начните просто

print_r($_SESSION);

Это просто выводит переменные сеанса, которые у вас есть, например, вы видите, что сервер запоминает сеанс и его переменные,

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

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

if(isset($_SESSION['your_key'])) {
// Your code if session has been made already
}

Я знаю, что это похоже на упрощенное, но, вернувшись к основам кода, не обязательно плохо, когда вы пытаетесь выяснить свои ошибки:) Так что попробуйте это, и если оба из них работают для вас, вы используете неверные утверждения, которые являются ложными, даже если ваши переменные сеанса неповреждены...:)

Ответ 3

Как вы упомянули в своем вопросе и в комментариях, пользователь не только перемещается в другой домен, но и на другой сервер (следовательно, изменение от http до https имеет для нас больше смысла), $_SESSION является суперглобальным, который сохраняется на сервере, поэтому смена серверов является наиболее вероятной причиной уничтожения вашего значения $_SESSION.

В ФАКТЕ он может все еще существовать, но поскольку вы пытаетесь получить к нему доступ с другого сервера, сервер не может его найти и, следовательно, ведет вас (или сервера), чтобы поверить был разрушен (поскольку он живет на исходном сервере, который начал сеанс). Это объясняет, почему это иногда работает, а иногда нет, поскольку вы можете переключаться между серверами, а иногда вам повезло и находятся на том же сервере, который создал сеанс в первую очередь.

Ответ 4

Пожалуйста, прочитайте о session.cookie_secure в руководстве php.net

Это ограничивает ваш cookie сеанса только защищенным (так https) соединением. В результате потери сеанса при переходе с https на http

Ответ 5

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

Я неправильно выполнил сеанс?

Да.

Код трудно прочитать, использует оператор switch ненадлежащим образом, переопределяет системную конфигурацию без уважительной причины и многие другие странные вещи. Не в последнюю очередь это то, что это особенно необычный случай использования, когда вы должны требовать, чтобы сеанс был активным так долго (способность "помнить меня" сильно отличается от сеанса). Как только вы вылизываете проблему сохранения на сессии, вы можете прочитать некоторые стандарты стиля PHP и посетить codereview.stackexchange.com