2014-03-05 6 views
0

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

Я только что заметил, что после открытия браузера Chrome, который отправился на последнюю страницу, он был на несколько дней назад (с повторным запуском), который был одним из страниц веб-сайта, на котором вы можете только доступ после входа в систему. Я подумал, что это странно, поскольку сессия должна была истекла.

В верхней части каждой страницы у меня есть:

session_start(); 

, если пользователь входит в бэкэнд успешно я установить переменный сеанс, как это:

$_SESSION['userAuthenticated'] = TRUE; 

, если пользователь нажмет выход из системы кнопка делает это:

$_SESSION = array(); 
session_unset(); 
session_destroy(); 

В моем файле php.ini у меня есть набор последующих:

session.cookie_lifetime 0 (0 for both local value and master value) 
session.gc_maxlifetime 900 (900 for both local value and master value) 

Было мое понимание, что сеанс останется в живых в течение 15 минут и будет уничтожен, если пользователь полностью покинет браузер. Я только что тестировал это, и я могу полностью выйти из браузера, открыть его снова и получить доступ к одной из страниц, для которой требуется логин.

Я делаю что-то не так здесь - я не всегда могу ожидать, что пользователи нажмут кнопку «Выход», но я ожидаю, что сессия не будет работать через 15 минут или если они полностью покинут браузер.

UPDATE: вот как я проверяю, если пользователь уже аутентифицирован:

if (!isset($_SESSION['userAuthenticated']) and $_SESSION['userAuthenticated'] !== TRUE) { 
header('Location: index.php'); 
die; 
} 
+0

'$ _SESSION = array();' не требуется. Также, пожалуйста, покажите, как вы проверяете '$ _SESSION ['userAuthenticated']', чтобы проверить, зарегистрирован ли пользователь или нет. – Raptor

+0

Возможно, вы загрузите страницу из кеша.Показывает ли он, что вы вошли в систему, если обновляетесь? – Mike

+0

@Raptor - я использую это для проверки подлинности пользователя: if (! Isset ($ _ SESSION ['userAuthenticated']) и $ _SESSION ['userAuthenticated']! == TRUE) { header ('Location : index.php '); die; } – user982124

ответ

0

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

Пример: Если вы используете базу данных, чтобы сохранить логин и пароль пользователя (которые должны быть хэшированы с солью, если они есть), тогда у вас есть таблица настройки для истории (которая в любом случае должна быть активной). Он отслеживает, когда каждый пользователь входит в систему и какой ip (для будущей безопасности). В этой истории будет отметка времени первого входа и последнего действия, и когда пользователь обновит страницу или что-нибудь сделает, она обновит последнюю временную метку активности. И любое действие должно начинаться с проверки этих двух последних логинов для этого имени пользователя, а если большой пробел (вы заявили 15 минут), это автоматический session_unset и уничтожить, прежде чем что-либо еще будет сделано.

0

Сессии на PHP работают с сеансом типа файлов cookie, на серверной стороне информация о сеансе постоянно удаляется. Для того, чтобы установить время жизни сеанса, вы можете использовать функцию session_set_cookie_params перед тем session_start:

session_set_cookie_params(3600,"/"); // 3600 seconds (1 hour) OR 900 for 15 mins 
session_start(); 

Браузеры уничтожить только куки сессии, когда весь процесс браузер закрывается. Не существует надежного способа определить, когда пользователь закрыл вкладку. Существует обработчик onbeforeunload, к которому вы можете подключиться, и, надеюсь, удастся сделать аякс-вызов серверу, чтобы сказать, что закрытие вкладки, но оно не является надежным.

Смежные вопросы