Я пытался найти в Интернете возможные ответы на этот вопрос, но я действительно не могу понять это. Есть много людей с подобной проблемой, но у меня есть уникальное прикосновение к ней, которое я не понимаю, и я не встречал его нигде.Сессия 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-код, который я использую для хранения переменных сеанса, находится вне моего веб-корня, но проблема не решена, если я помещаю их обратно в свой корень, поэтому я предполагаю, что может Это проблема.
удалить 'session_regenerate_id (истина)' Вы не хотите, чтобы регенерировать идентификатор сессии. пусть php обрабатывает весь файл идентификатора сеанса. То, что вам нужно, это '$ _SESSION ['myid']', в котором содержится ключ к требуемому элементу базы данных. – Tschallacka
Спасибо, но в соответствии с учебным пособием, на который я ссылаюсь, безопаснее восстанавливать идентификатор сеанса; «Также функция session_regenerate_id(), которая восстанавливает идентификатор сеанса при каждой перезагрузке страницы, помогает предотвратить захват сеанса». Это правда, или лучше не восстанавливаться? –
Посмотрите на это так ... Запрос пользователя: дайте мне эту страницу. ваш сайт: Хорошо посетитель aeb123. гость. хорошо им aeb123 вам. твой сайт. Нах, я назову тебя чуваком123. следующий запрос. Привет сайт, im aeb123. ваш сайт я не знаю ни одного aeb123. Я знаю только dude123. Для защиты от захвата сеанса используйте идентификаторы длинных сеансов. им труднее выполнить команду за время до окончания сессии. Соедините это с защитой от наводнений, которая дросселирует пользователя, если он делает более 100 запросов в минуту на той же странице, у вас довольно приличная защита. – Tschallacka