Идентификатор сессии PHP в суперглобальном $ _COOKIES остается неизменным после уничтожения - PullRequest
0 голосов
/ 31 октября 2018

Hy Я новичок в php и пытаюсь уничтожить сеанс в соответствии с документацией php здесь: http://php.net/manual/en/function.session-destroy.php поэтому я использую этот код:

<?php
session_start();

echo 'cokkies before delete session';
var_dump($_COOKIE);
var_dump($_SESSION);
echo '-------------- <br>';

$_SESSION = array();

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_destroy();
echo 'cokkies after delete session';
var_dump($_COOKIE);
var_dump($_SESSION);
?>
Я не понимаю, сколько раз я запускаю этот код, свойство PHPSESSID в суперглобальном $ _COOKIE всегда одинаково. enter image description here

Значит, тогда идентификатор сеанса на сервере вообще уничтожается, и только идентификатор в файле cookie остается в живых? И в целом, почему это работает так. Спасибо за ответы

Ответы [ 4 ]

0 голосов
/ 31 октября 2018

Hy Итак, я выяснил, почему функция setcookie () не уничтожает файл cookie PHPSESSID. Функция session_set_cookie_params () должна быть установлена ​​до начала сеанса, и поэтому позже функция setcookie () сможет завершить действие файла cookie PHPSESSID.

этот код работает:

<?php
$lifetIme = 60 * 60 * 24 * 360; 
$path = '/'; 
$domain =  'yourdomain'; 
$secure = isset($_SERVER["HTTPS"]); 
$httponly = true;
session_set_cookie_params ($lifetIme, $path, $domain, $secure, $httponly);
session_start();

$expire = strtotime('-1 year');
setcookie('PHPSESSID', '', $expire, $path, $domain, $secure, $httponly);
session_destroy();
?>
он создаст и затем полностью уничтожит сеанс, и следующий вызов на сервер из того же браузера не будет знать о предыдущем сеансе и его файле cookie PHPSESSID
0 голосов
/ 31 октября 2018

Просто используйте session_regenerate_id() после уничтожения сеанса.
https://secure.php.net/manual/en/function.session-regenerate-id.php

Кроме того, уничтожение сеансов не приводит к удалению файла cookie.

0 голосов
/ 31 октября 2018

хорошо, привет, просто хочу пропустить несколько вещей. Ладно, все просто, сеанс уничтожен, не отменяется то, что было установлено в cookie. Как мы все знаем, куки доступны до истечения срока действия. И даже если сеанс будет восстановлен, он все равно обновит cookie. Я бы посоветовал вам управлять этим, если вы обновите эту страницу миллион раз, и вы все равно получите тот же результат, что и результат. Это больше похоже на то же самое и ожидание лучшего результата. Я мог бы написать вам фрагмент, если хотите. Надеюсь, это поможет

=== Мое открытие ==

<?php

session_start();

define('NEWLINE', '<br><br>');

echo "cookie before delete session. <br>";
var_dump($_COOKIE);

echo NEWLINE;

echo "session Here <br>";
var_dump($_SESSION);

echo NEWLINE;


echo "------------------------<br>";

$_SESSION = array();

if (ini_get('session.use_cookies'))
{
    $params = session_get_cookie_params();

    echo "cookie already has PHPSESSID even before you set it here ..<br>";


    // The solution i could arrive with
    // without this PHPSESSID wouldn't give you a new id.
    session_regenerate_id();
}

// now destroy
session_destroy();

echo "Cookie here would not change. Just refresh the page and try commenting session_regenerate_id() to see the difference. <br>";
var_dump($_COOKIE);

echo "Session when destroyed. <br>";
var_dump($_SESSION);
?>
0 голосов
/ 31 октября 2018

См. Документацию :

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

… даже если он не установил сеансовый файл cookie, в суперглобальный файл $_COOKIES входят все файлы cookie, отправленные браузером при отправке запроса. Для session_destroy потребуется путешествие во времени, чтобы браузер не отправлял их в запросе, который в данный момент обрабатывается.


что я не понимаю, не имеет значения, сколько раз я запускаю этот код, свойство PHPSESSID в суперглобальном элементе $ _COOKIE всегда одинаково.

Если идентификатор сеанса, отправленный браузером, не совпадает с существующим сеансом, то при вызове start_session он все равно использует тот же идентификатор сеанса для нового сеанса.

session_regenerate_id форсирует генерацию нового идентификатора, start_session - нет.

...