【发布时间】:2014-05-18 18:22:23
【问题描述】:
我有一个拥有会员系统的网站。当用户登录时,我从数据库验证用户名/密码并启动一个会话,$_SESSION['userid'] 包含他们的 id(我还没有使用 cookie 实现任何东西)
我有一个问题,系统在大多数情况下都可以正常工作,但有些用户报告说他们最终发现自己登录到了其他一些随机用户帐户。这可能意味着 $_SESSION['userid'] 毫无理由地更改为其他内容,我很确定我没有做任何更改。
任何想法为什么会发生这种情况?
编辑:我在做什么的总结
此方法启动会话
function startSession($id){
$_SESSION['logged_in'] = 1;
$_SESSION['userid'] = $id;
}
此方法检查登录
function isLoggedIn(){
return isset($_SESSION['logged_in']) && isset($_SESSION['userid']) && $_SESSION['userid']!=" " && $_SESSION['logged_in']==1;
}
这是注销方法
function logout(){
$_SESSION['logged_in'] = 0;
$_SESSION['userid'] = 0;
unset($_SESSION['logged_in']);
unset($_SESSION['userid']);
session_destroy();
if (!isLoggedIn()){ return "S3"; }
else { return "E3"; }
}
这就是我检查用户是否在大多数地方登录的方式
if (isLoggedIn()){ $profileid = $_SESSION['userid']; }
这是登录函数,这里是我调用startSession的地方
function login($username, $password){
$pdo = newPDO();
$username = sanitize_string($username);
$password = sha1(sanitize_string($password));
$query = $pdo->prepare("SELECT id FROM ".TABLE_PROFILE." WHERE nick=:nick AND pass=:pass LIMIT 1");
$query->execute(array(':nick'=>$username, ':pass'=>$password));
$result = $query->fetch(PDO::FETCH_ASSOC);
if (count($result['id']) == 1){
startSession($result['id']);
loginExecution();
return "S1";
}
else{ return "E1"; }
}
【问题讨论】:
-
您需要为您正在使用的所有页面发布代码。可能的原因太多了。
-
@Fred-ii- 不同文件中有数千行代码。我只需要对可能出错的地方提出意见^^
-
问题不在SESSION上,是你的登录脚本的问题。如果您想获得正确的解决方案,请发布脚本
-
哼,奇怪。也许一个仍然活跃的会话 id 被分配给了另一个用户。当另一个用户获得相同的会话 ID 时,他们将控制该帐户。但如果没有手动设置会话 ID,则不太可能发生这种情况。
-
“我”太难说了。通常会话是从
$_POST变量分配的,例如$user=$_POST['user']; $_SESSION['user'] = $user;类型的事物。如果除此之外还有任何其他变化,或者您已将其分配给列/行,那么这可能是一个因素。
标签: php session web session-variables session-state