我有一个有会员制的网站。当用户登录时,我从数据库中验证用户名/密码并启动一个会话,$_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"; }
}
问题出在您的登录功能
您的脚本不会检查用户名和密码以获取任何数据,如果用户名和密码为空或不正确,则客户端将从数据库中获取 firs 可用 id。
function login($username, $password){
$pdo = newPDO();
$username = sanitize_string($username);
$password = sanitize_string($password);
// Check data for existing
if (empty($username)) throw new Exeption('Empty username');
if (empty($password)) throw new Exeption('Empty password');
$password = sha1($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"; }
}
附言:在SQL查询之前,始终检查传入的数据
实际上,我能想到的唯一会导致这种情况的事情是将$_SESSION['userid']设置为另一个成员ID的东西。 假设这是您用来检查要显示的成员信息的内容。如果未设置 $_SESSION['userid'] 变量,最终可能会错误地设置 $_SESSION['userid'],您是否可能会做一些事情?即,如果他们的 PHP 会话被重置。