2014-02-05 3 views
1

Я пытаюсь разобраться в сеансах PHP.Удаленные переменные сеанса после session_regenerate_id()

Я использую ShortPHP в качестве маршрутизатора, но код ShortPHP не касается сеансов.

Шаблон имеет session_start() в первой строке: -

<?php 
session_start(); 
include 's.php'; 
var_dump($_SESSION); 
$sid = session_id(); 
echo $sid; 
?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head> 

Этот шаблон выполнен первый для каждой страницы (я добавил первые несколько строк (var_dump и т.д.) с целью отладки), а затем конкретный код страницы. В данном случае, я использую следующий код: -

<?php 
if (!defined('S')) die ("You've got no S"); // part of ShortPHP - irrelevant 

if (!isset($_SESSION['login']) || $_SESSION['login'] != "1") { 
     echo "<p>Session is NOT set</p>"; 
     //header() redirect to login here... 
     //exit(); 
} 

$sri = session_regenerate_id(); 
var_dump($sri); 

?> 

Если я закомментировать session_regenerate_id() тогда переменная сеанса (login) по-прежнему доступен после перезагрузки страницы, но с session_regenerate_id() включена, переменная сеанса будет удалена когда я перезагружаю страницу. Обратите внимание, что session_regenerate_id() возвращает true каждый раз.

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

Я делаю что-то неправильно здесь?

+0

У вас есть какой-либо вывод в браузере перед сбросом идентификатора и что возвращает 'session_regenerate_id()'? – jeroen

+0

Отредактировал вопрос с ответами на ваши вопросы: Да и True – garethTheRed

+0

Странно. Это имеет значение, если вы используете 'session_regenerate_id()' перед отправкой заголовков (вывод отправляется в браузер)? – jeroen

ответ

2

Причина: session.cookie_secure установлено в php.ini, когда https не использовался. Как только я удалил эту настройку, сеанс продолжался между обновлением страницы.

0

Обычно рекомендуется передать true в качестве парметометра в session_regenerate_id();, поскольку это позволит удалить старые данные сеанса.

+0

Вся идея состоит в том, чтобы не удалять старые данные сеанса - я надеялся, что он будет передан новому идентификатору сеанса. – garethTheRed

+0

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

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