【发布时间】:2014-12-28 09:43:40
【问题描述】:
我有一个网站,有时用户会收到不正确的会话数据。我一直在用两个不同的用户快速登录测试它。我发现当用户 A 获取用户 B 的会话数据时,来自 session_id() 的 phpsessid 不等于浏览器中的 PHPSESSID cookie。
代码是这样的:
登录.php
if(isset($_POST['uname']) && isset($_POST['password'])){
$logged = login($_POST['uname'],$_POST['password']);
if($logged){
header( 'Location: index.php' ) ;
exit();
}
}
function login($uname,$password){
$user = check_db_user($uname,$password)
if($user){
session_regenerate_id(TRUE);
$_SESSION["name"] = $user->name;
...
return true;
}else{
return false;
}
}
登录工作正常。在 index.php 中,我看到了错误会话数据的问题。如果发生这种情况,我只需重新加载页面并呈现正确的会话数据。所以,我认为问题是重定向到 index.php 没有发送正确的 php 会话 ID。我已经尝试添加
header("Set-Cookie: PHPSESSID=" . session_id() . "; path=/");
在重定向之前,但它仍然不起作用。
注销.php
session_start();
$_SESSION = array();
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_destroy();
session_regenerate_id(TRUE);
header('location:login.php');
【问题讨论】:
-
您能否解释一下以下场景是如何发生的:“我发现当用户 A 获取用户 B 的会话数据时,来自 session_id() 的 phpsessid 不等于浏览器中的 PHPSESSID cookie。”
-
您使用两种不同的浏览器进行了测试,不是吗?
-
@ForguesR 它发生在 IE7 和 Chrome 中。首先我使用用户 A 登录,然后快速注销并使用用户 B 登录。重复此操作直到失败。
-
您必须在用户注销时使用
session_destroy();。那么这样的事情就永远不会发生了。 -
@jankal 我添加了我的注销文件。