我已经在我的系统中配置了wamp,并且正在本地环境中进行开发和测试。我正在开发注销功能,并且注意到在浏览器中生成的会话ID是相同的。
例如 - 即使在注销并登录后,chrome也会为所有用户生成会话ID = abc; IE总是为所有用户生成session id = xyz。
这是wamp /我的测试环境的问题吗?
请在下面找到我的注销php脚本 -
<?php
session_start();
$sessionid = session_id();
echo $sessionid;
session_unset();
session_destroy();
?>
答案 0 :(得分: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)
成功验证后重新生成会话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()可以用于此。
答案 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();