почему php каждый раз генерирует одни и те же идентификаторы сеанса в тестовой среде (WAMP)?

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

Например, chrome всегда генерирует идентификатор сеанса = abc для всех пользователей, даже после выхода из системы и входа в систему; IE всегда генерирует идентификатор сеанса = xyz для всех пользователей.

Это проблема с wamp/моей тестовой средой?

пожалуйста, найдите ниже мой php-скрипт выхода из системы -

<?php
session_start();
$sessionid = session_id();
echo $sessionid;
session_unset(); 
session_destroy(); 
?>

person arun nair    schedule 20.05.2011    source источник
comment
Это код, который у меня есть, и он работает!!! Надеюсь, это решит чью-то проблему. ‹?php session_start(); session_regenerate_id (ИСТИНА); // Для повторного создания идентификатора сеанса session_destroy(); ?›   -  person Praveen V    schedule 29.11.2012


Ответы (7)


Возможно, у вас все еще есть файл cookie со старым идентификатором сеанса, поскольку он не является ни session_unset, ни session_destroy удаляет этот файл cookie:

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

Поэтому используйте setcookie, чтобы аннулировать файл cookie идентификатора сеанса после выхода из системы:

if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

Другой рекомендацией является повторное создание идентификатора сеанса после успешной аутентификации с использованием session_regenerate_id(true).

person Gumbo    schedule 20.05.2011
comment
да, куки были проблемой. Я думал, что сеансы по умолчанию будут использовать файловый механизм сервера, а не файл cookie, поэтому я не опасался очищать файлы cookie. спасибо за код тоже .. работает как шарм! - person arun nair; 20.05.2011
comment
@arun: хранилищем сеансов PHP по умолчанию являются файлы. Файл cookie используется только для передачи идентификатора сеанса, который используется для идентификации данных сеанса в хранилище. - person Gumbo; 20.05.2011

Буду работать. Пожалуйста, попробуйте это

session_start(); 
session_regenerate_id(TRUE); 
session_destroy(); 
person Praveen V    schedule 29.11.2012

Вы должны повторно сгенерировать идентификатор сеанса, используя функцию session_regenerate_id(). Без этого идентификатор сеанса был бы одинаковым между обновлениями страницы.

person Tomasz Kowalczyk    schedule 20.05.2011

session_destroy() уничтожает все данные, связанные с текущим сеансом. Он не сбрасывает глобальные переменные, связанные с сеансом, и не сбрасывает файл cookie сеанса. Чтобы снова использовать переменные сеанса, необходимо вызвать session_start().

Чтобы завершить сеанс полностью, например, чтобы выйти из системы, идентификатор сеанса также должен быть отключен. Если файл cookie используется для распространения идентификатора сеанса (поведение по умолчанию), то файл cookie сеанса необходимо удалить. Для этого можно использовать setcookie().

Взято с http://php.net/manual/en/function.session-destroy.php

person Jasoon    schedule 20.05.2011
comment
Где я ошибаюсь? Я удалил все переменные сеанса с помощью сценария выхода из системы, и он также уничтожает сеанс. Итак, используя тот же браузер, если выполняется другой вход в систему, почему он по-прежнему использует тот же идентификатор сеанса, что и предыдущий пользователь? Я сослался на php.net, в котором говорится: функция session_unset() освобождает все зарегистрированные переменные сеанса. - person arun nair; 20.05.2011
comment
Добавьте туда session_regenerate_id() перед session_destroy(), и вы должны получить новый идентификатор? - person Jasoon; 20.05.2011
comment
session_unset() сбросит переменные сеанса, а не завершит сеанс. Это просто делает так, что $_SESSION['whatever'] не существует в сеансе, однако вы все равно можете установить переменные в сеанс и продолжить его использовать. Session_destroy фактически удалит файл сеанса с сервера, поэтому при следующей загрузке сеанс не сможет найти данные. - person Jonathan Kuhn; 20.05.2011

session_unset() и session_destroy() не удаляют файл cookie сеанса. Вы должны вручную отключить его с помощью вызова setcookie().

session_unset является обратным session_register(), и session_destroy просто очищает $_SESSION, не затрагивая куки.

person Marc B    schedule 20.05.2011

из руководства (session_destroy):

session_destroy() уничтожает все данные, связанные с текущим сеансом. Он не сбрасывает глобальные переменные, связанные с сеансом, и не сбрасывает файл cookie сеанса. Чтобы снова использовать переменные сеанса, необходимо вызвать session_start().

Чтобы завершить сеанс полностью, например, чтобы выйти из системы, идентификатор сеанса также должен быть отключен. Если файл cookie используется для распространения идентификатора сеанса (поведение по умолчанию), то файл cookie сеанса необходимо удалить. Для этого можно использовать setcookie().

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

person Jonathan Kuhn    schedule 20.05.2011

Чтобы остановить захват сеанса, следуйте приведенному ниже коду в PHP.

    session_start();

    /* to stop session hijacking */

    // Generate new session without destroying the old one
    session_regenerate_id(false);

    // Fetch current session ID and close both sessions to allow other scripts to use them
    $newSession = session_id();
    session_write_close();

    // Assign session ID to the new one, and start it back up again
    session_id($newSession);

    session_start();
person Senior PHP Developer    schedule 14.09.2017