PHP 会话变量随机变化


php session variable randomly changes

我有一个有会员制的网站。当用户登录时,我从数据库中验证用户名/密码并启动一个会话,$_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 会话被重置。