2015-04-07 2 views
0

Я пытался найти в Интернете возможные ответы на этот вопрос, но я действительно не могу понять это. Есть много людей с подобной проблемой, но у меня есть уникальное прикосновение к ней, которое я не понимаю, и я не встречал его нигде.Сессия PHP сбрасывается при обновлении

Я создал систему входа, которая отлично работала. Тем не менее, я хотел сделать его более безопасным, поэтому я использовал этот учебник: http://www.wikihow.com/Create-a-Secure-Login-Script-in-PHP-and-MySQL. Я все еще могу войти в систему, но всякий раз, когда я обновляю свою страницу, я автоматически выхожу из системы. После того, как я понял, что идентификатор сеанса меняется.

Любопытно, когда я вызываю var_dump ($ _ SESSION); на третьей строке моего кода (непосредственно после session_start();) идентификатор сеанса остается прежним, и все работает. Как только я прокомментирую эту строку, проблема вернется.

я регенерировать идентификатор сессии, используя следующий код:

$session_name = 'robinator123'; // Set a custom session name 
$secure = FALSE; 
// This stops JavaScript being able to access the session id. 
$httponly = true; 
// Forces sessions to only use cookies. 
if (ini_set('session.use_only_cookies', 1) === FALSE) { 
    header("Location: ../error.php?err=Could not initiate a safe session (ini_set)"); 
    exit(); 
} 
// Gets current cookies params. 
$cookieParams = session_get_cookie_params(); 
session_set_cookie_params($cookieParams["lifetime"], 
    $cookieParams["path"], 
    $cookieParams["domain"], 
    $secure, 
    $httponly); 
// Sets the session name to the one set above. 
session_name($session_name); 
session_start();   // Start the PHP session 
session_regenerate_id(true); // regenerated the session, delete the old one. 

Когда я называю var_dump ($ _ SESSION) ;, регенерация терпит неудачу, потому что заголовки уже отправлены в var_dump. Однако, когда я заменяю var_dump нормальным выражением echo, заголовки также терпят неудачу, но идентификатор сеанса все равно изменяется. Я понятия не имею, что происходит.

Несколько замечаний:

  • Я не забыл назвать session_start(); в начале моего кода
  • включенный PHP-код, который я использую для хранения переменных сеанса, находится вне моего веб-корня, но проблема не решена, если я помещаю их обратно в свой корень, поэтому я предполагаю, что может Это проблема.
+2

удалить 'session_regenerate_id (истина)' Вы не хотите, чтобы регенерировать идентификатор сессии. пусть php обрабатывает весь файл идентификатора сеанса. То, что вам нужно, это '$ _SESSION ['myid']', в котором содержится ключ к требуемому элементу базы данных. – Tschallacka

+0

Спасибо, но в соответствии с учебным пособием, на который я ссылаюсь, безопаснее восстанавливать идентификатор сеанса; «Также функция session_regenerate_id(), которая восстанавливает идентификатор сеанса при каждой перезагрузке страницы, помогает предотвратить захват сеанса». Это правда, или лучше не восстанавливаться? –

+1

Посмотрите на это так ... Запрос пользователя: дайте мне эту страницу. ваш сайт: Хорошо посетитель aeb123. гость. хорошо им aeb123 вам. твой сайт. Нах, я назову тебя чуваком123. следующий запрос. Привет сайт, im aeb123. ваш сайт я не знаю ни одного aeb123. Я знаю только dude123. Для защиты от захвата сеанса используйте идентификаторы длинных сеансов. им труднее выполнить команду за время до окончания сессии. Соедините это с защитой от наводнений, которая дросселирует пользователя, если он делает более 100 запросов в минуту на той же странице, у вас довольно приличная защита. – Tschallacka

ответ

0

Я действительно решил проблему, отредактировав кусок кода регенерации. Удаление регенерации не сработало, но я исправил ее, установив параметры, которые я забыл изменить (например, время жизни, путь и домен), и удалив параметр «true» из session_regenerate_id(); (я буквально скопировал этот код из учебника и не заметил этих вещей, когда делал все изменения).

Однако, я все еще очень интересно, как var_dump удалось избежать проблемы ..

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