为啥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_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)
成功进行身份验证后重新生成会话 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?的主要内容,如果未能解决你的问题,请参考以下文章