为啥php每次在测试环境(WAMP)中生成相同的会话ID?

Posted

技术标签:

【中文标题】为啥php每次在测试环境(WAMP)中生成相同的会话ID?【英文标题】:why is php generating the same session ids everytime in test environment (WAMP)?为什么php每次在测试环境(WAMP)中生成相同的会话ID? 【发布时间】:2011-08-29 21:24:59 【问题描述】:

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

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

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

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

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

【问题讨论】:

这是我的应用程序的代码,它可以工作!!!希望它能解决某人的问题。 【参考方案1】:

您可能仍然有包含旧会话 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。

【讨论】:

是的,cookie 是问题所在。我认为会话默认使用服务器文件机制,而不是 cookie,所以我并不担心清除 cookie。也感谢您的代码.. 就像一个魅力! @arun:PHP 的默认会话存储是文件。 cookie仅用于传输会话ID,用于识别存储中的会话数据。【参考方案2】:

会工作。请试试这个

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

我哪里出错了?我已经使用注销脚本取消了所有会话变量,它也破坏了会话。那么使用相同的浏览器,如果进行了不同的登录,为什么它仍然使用与前一个用户相同的会话 id?我参考了 php.net,上面写着 - “session_unset() 函数释放当前注册的所有会话变量。” 在 session_destroy() 之前扔一个 session_regenerate_id() ,你应该得到一个新的 id? session_unset() 将取消设置会话变量,而不是结束会话。它只是使会话中不存在 $_SESSION['whatever'] ,但是您仍然可以将变量设置到会话中并继续使用它。 Session_destroy 实际上会从服务器上删除会话文件,因此下次加载时没有数据可供会话查找。【参考方案5】:

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

session_unset 是 session_register() 的反面,session_destroy 只是简单地清除 $_SESSION 而不影响 cookie。

【讨论】:

【参考方案6】:

来自manual (session_destroy):

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

为了终止会话 总而言之,就像注销用户一样, 会话 ID 也必须取消设置。如果 cookie 用于传播 会话 ID(默认行为),然后 必须删除会话 cookie。 setcookie() 可以用于此。

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

【讨论】:

【参考方案7】:

要停止会话劫持,请遵循以下 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();

【讨论】:

以上是关于为啥php每次在测试环境(WAMP)中生成相同的会话ID?的主要内容,如果未能解决你的问题,请参考以下文章

修改wamp中的php.ini文件为啥总是没有效果

phpwamp和wampserver有啥关系,为啥名字都带wamp这几个字母,两者有区别吗?我应该用哪个?

在php中生成连续数字[关闭]

在PHP中生成动态QR码

php环境如何配置

为啥在 wamp 上更新 php 7.1.3 后 laravel 5.6 没有安装?