php会话变量随机变化

php会话变量随机变化,php,session,web,session-variables,session-state,Php,Session,Web,Session Variables,Session State,我有一个有会员制的网站。当用户登录时,我从数据库验证用户名/密码并启动一个会话,$\u会话['userid'],其中包含他们的id。我还没有使用cookie实现任何功能 我有一个问题,该系统在大多数情况下运行良好,但一些用户报告说,他们最终发现自己登录到了其他一些随机用户的帐户。这可能意味着$_SESSION['userid']在没有任何原因的情况下更改了其他内容,我很确定我没有做任何事情来更改它 你知道为什么会这样吗 编辑:我正在做的事情的摘要 此方法用于启动会话 function start

我有一个有会员制的网站。当用户登录时,我从数据库验证用户名/密码并启动一个会话,$\u会话['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"; }
}

实际上,我能想到的唯一一件事就是将$_SESSION['userid']设置为另一个成员id。假设这是您用来检查要显示哪些成员信息的内容。如果未设置$\u SESSION['userid']变量,可能会导致$\u SESSION['userid']设置不正确,您是否正在执行某些操作?i、 e.如果他们的php会话被重置。

问题在于您的登录功能

您的脚本没有检查任何数据的用户名和密码,如果用户名和密码为空或不正确,您的客户端将从数据库获取第一个可用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查询之前,请始终检查传入的数据

您需要发布您正在使用的所有页面的代码。可能的原因太多了。@Fred ii-不同的文件中有数千行代码。我只需要对可能出现的问题发表意见^^问题不在于会话,而在于登录脚本中的问题。如果你想得到正确的解决方案,请发布脚本。可能仍处于活动状态的会话id已分配给另一个用户。当其他用户获得相同的会话id时,他们将控制该帐户。但是,如果会话id不是手动设置的,这不太可能发生。我很难说。通常,会话是从$u POST变量分配的,例如$user=$u POST['user']$_会话['user']=$user;这类事情。如果除此之外还有其他更改,或者您已将其分配给列/行,那么这可能是一个因素。我从ajax调用的另一个脚本调用登录函数,在这里我检查是否设置了用户名和密码。下面是代码:如果isset$_POST['username']和&isset$_POST['password']{$logged=login$_POST['username'],则$_POST['password'];echo getMessage$logged;}否则{echo getMessageE5;}Javascript验证对于授权表单来说是非常糟糕的,因为如果客户端在浏览器中禁用Javascript,我认为验证不起作用TS肯定必须测试输入参数,但无论如何,如果参数为空,查询将返回一个空集,我假设表中不包含数据为空的行。如果登录名为空格,isset函数返回true。您必须使用空函数true进行检查,空格将在isset返回true。但这并不能解释会话id神奇变化这一令人震惊的事实:D对此有什么想法吗?