#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 сеанса, я не думал понимать, что, хотя вы не можете перезаписать его параметры, вы все равно можете изменить значения его ключей. Я приму ваш ответ, поскольку он действительно имеет смысл, теперь, когда я подумал об этом.