$ _COOKIES超全局变量中的PHP会话ID销毁后保持不变

时间:2018-10-31 13:34:21

标签: php session cookies destroy superglobals

您好,我是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);
?>
我不明白的是,无论运行此代码多少次,$ _ COOKIE超全局变量中的PHPSESSID属性始终完全相同。 enter image description here

那么,服务器上的会话ID是否会完全销毁,而cookie中的ID仍然有效?总体而言,为什么会这样解决? 感谢您的回答

4 个答案:

答案 0 :(得分:0)

请参见documentation

  

session_destroy()销毁与当前会话关联的所有数据。它不会取消设置与该会话关联的任何全局变量,也不会取消设置会话cookie。要再次使用会话变量,必须调用session_start()。

…即使已取消设置会话cookie,$_COOKIES超全局也包括浏览器发出请求时发送的所有cookie。 session_destroy需要花费时间,以防止浏览器在当前正在处理的请求中发送它们。


  

我不理解的是,无论运行此代码多少次,$ _ COOKIE超全局变量中的PHPSESSID属性始终完全相同。

如果浏览器发送的会话ID与现有会话不匹配,则在调用start_session时,新会话仍将使用相同的会话ID。

session_regenerate_id强制生成新ID,start_session则不生成。

答案 1 :(得分:0)

销毁会话后只需使用session_regenerate_id()
https://secure.php.net/manual/en/function.session-regenerate-id.php

销毁会话也不会取消设置cookie。

答案 2 :(得分:0)

好吧,我只想留下一些东西。好的,很简单,会话销毁并不会取消设置Cookie的设置。众所周知,在有效期结束之前,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);
?>

答案 3 :(得分:0)

嘿,所以我发现了为什么setcookie()函数没有破坏PHPSESSID cookie。在开始会话之前需要设置session_set_cookie_params()函数,因此稍后setcookie()函数将能够使PHPSESSID cookie失效。

此代码有效:

<?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();
?>
它会创建并完全销毁该会话,并且从同一浏览器对服务器的下一次调用将不知道上一个会话及其PHPSESSID cookie