4

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

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

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

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

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

7 回答 7

7

您可能仍然拥有带有旧会话 ID 的 cookie,因为既不session_unset也不session_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).

于 2011-05-20T18:42:19.260 回答
4

将工作。请试试这个

session_start(); 
session_regenerate_id(TRUE); 
session_destroy(); 
于 2012-11-29T08:54:10.807 回答
2

您必须使用 function 重新生成会话 ID session_regenerate_id()。否则,页面刷新之间的会话 ID 将相同。

于 2011-05-20T18:35:41.863 回答
2

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

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

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

于 2011-05-20T18:40:07.283 回答
1

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

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

于 2011-05-20T18:41:17.670 回答
1

来自手册(session_destroy):

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

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

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

于 2011-05-20T18:42:40.367 回答
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();
于 2017-09-14T08:11:36.820 回答