Как (если возможно) установить и отменить переменные сеанса / остановить перезапись файлов cookie сеанса?

#php #session #cookies #session-variables

#php #сессия #файлы cookie #переменные сеанса

Вопрос:

Для справки, вот мой сценарий:

Я создаю автономную платформу для определенной ниши, и частью этой платформы является процесс входа в систему, который, если он подтвержден, устанавливает сеанс для пользователя. При каждой загрузке страницы администрирования сеанс запускается, и переменная $_SESSION['key'] проверяется, соответствует ли она действительности.

Если значение равно false, пользователь перенаправляется на страницу входа с ошибкой, указывающей ему снова войти в систему.

Проблема в том, что это зависит от того, установлен или не установлен файл cookie сеанса, в том смысле, что когда срок действия файла cookie сеанса истекает и сеанс запускается с session_start() для проверки $_SESSION['key'] , поэтому создается новый файл cookie сеанса со значениями по умолчанию (я использую session_set_cookie_params() для изменения пути, времени ожидания и т.д.), Что делает невозможным повторный вход в систему, поскольку файлы cookie сеанса не перезаписываются из того, что я вижу.

Чтобы исправить это, я думал об использовании чего-то подобного session_set_cookie_params(5, ..) ранее session_start() при проверке $_SESSION['key'] , что создаст 5-секундный файл cookie сеанса, что позволит создавать новый при повторном входе в систему, но я не уверен, сработает ли это — и я также уверен, что должен быть более эффективный способ установки / отмены переменной сеанса?

Вот мой код:

Запустите сеанс, если логин подтвержден

 if($validated){
    session_set_cookie_params(1800, "/inst", $server_name['home']); 
    session_name("_inst");
    session_start();
    $_SESSION['key'] = true;
}
  

Проверьте, по-прежнему ли значение $_SESSION[‘key’] равно true

 session_name("_inst");
session_start();

if(!$_SESSION['key']) {
    header('Location: ' . $server['home'] . '/login/?error=1');
}
  

Любые ответы или советы были бы замечательными, и, пожалуйста, спросите, нужны ли вам разъяснения по чему-либо!

Ответ №1:

Просто запустите session_start() на всех страницах. Это безоговорочно создаст для вас сеанс, после чего вы сможете проверить наличие / отсутствие ключа:

 <?php

session_start();

if (!isset($_SESSSION['key'])) { // never logged in, or were logged in and got logged out
   ... redirect to login ...
   exit();
}

if ($_SESSION['key'] != 'expected value') { // logged in, but no longer a valid login.
   ... redirect to login ...
   exit();
}
  

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

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

Комментарии:

1. Я слышу, что вы говорите, но разве мне все еще не нужно отменить установку ключа? Я хочу предоставить пользователям максимальное количество времени (например, 12 часов) для входа в систему, прежде чем им потребуется повторный вход. Если я не изменю параметры cookie по умолчанию, как я смогу это сделать? Прошу прощения, если я не прояснил это, теперь я понимаю, что на самом деле не упомянул, почему я использовал session_set_cookie_params() функцию. Суть в том, что если я не позволю сеансу прерваться, мне нужно отменять / устанавливать $_SESSION['key'] переменную каждые 12 часов.

2. вы должны установить время жизни файла cookie в php.ini, чтобы оно было глобальным для всех ваших страниц, чтобы ВСЕ вызовы session_start() создавали новый файл cookie (при необходимости) с соответствующим временем истечения срока действия. Вы также должны убедиться, что сборщик мусора сеанса PHP не запускается в течение этого 12-часового периода (для этого также есть дополнительные настройки .ini), иначе вы все равно получите людей с действительными файлами cookie сеанса, но без соответствующего файла сеанса, потому что PHP его очистил.

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