为什么php每次都在测试环境(WAMP)中生成相同的会话id?

时间:2011-05-20 18:33:46

标签: php unique wamp logout sessionid

我已经在我的系统中配置了wamp,并且正在本地环境中进行开发和测试。我正在开发注销功能,并且注意到在浏览器中生成的会话ID是相同的。

例如 - 即使在注销并登录后,chrome也会为所有用户生成会话ID = abc; IE总是为所有用户生成session id = xyz。

这是wamp /我的测试环境的问题吗?

请在下面找到我的注销php脚本 -

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

7 个答案:

答案 0 :(得分:7)

您可能仍然拥有包含旧会话ID的Cookie,因为session_unsetsession_destroy都没有删除该Cookie:

  

为了完全终止会话,要将用户注销,还必须取消设置会话ID。如果使用cookie来传播会话ID(默认行为),则必须删除会话cookie。可以使用setcookie()

因此,在注销后使用setcookie使会话ID 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)成功验证后重新生成会话ID。

答案 1 :(得分:3)

会工作吗?请试试这个

session_start(); 
session_regenerate_id(TRUE); 
session_destroy(); 

答案 2 :(得分:2)

您必须使用函数session_regenerate_id()重新生成会话ID。没有它,会话ID在页面刷新之间将是相同的。

答案 3 :(得分:2)

  

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

     

为了完全终止会话,要将用户注销,还必须取消设置会话ID。如果使用cookie来传播会话ID(默认行为),则必须删除会话cookie。 setcookie()可以用于此。

取自http://php.net/manual/en/function.session-destroy.php

答案 4 :(得分:1)

session_unset()session_destroy()不会删除会话Cookie。您必须通过setcookie()电话手动取消设置。

session_unset与session_register()相反,session_destroy只是清除$ _SESSION而不影响cookie。

答案 5 :(得分:1)

来自manual(session_destroy):

  

session_destroy()会破坏所有的   与当前相关的数据   会话。它没有取消任何一个   与...相关的全局变量   会话,或取消设置会话cookie。   要再次使用会话变量,   必须调用session_start()。

     

为了杀死会话   总而言之,喜欢将用户注销,   会话ID也必须取消设置。如果   一个cookie用于传播   会话ID(默认行为),然后   必须删除会话cookie。   setcookie()可以用于此。

除非你专门取消设置cookie,否则cookie仍然存在,并且下次调用session_start()时,它将使用它作为会话ID。关闭浏览器也应该清除cookie,因为它们通常由php设置为在浏览器关闭时到期。

答案 6 :(得分:0)

要停止会话劫持,请按照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();