php会话变量随机更改

时间:2014-04-06 16:20:03

标签: php session web session-variables session-state

我有一个拥有会员制的网站。当用户登录时,我从数据库中验证用户名/密码并启动一个包含其id的$ _SESSION ['userid']会话(我还没有使用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"; }
}

2 个答案:

答案 0 :(得分:0)

问题在于您的登录功能

您的脚本没有检查任何数据的用户名和密码,如果用户名和密码为空或不正确,您的客户端将从数据库中获取第一个可用的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"; }
}

P.S。在SQL查询之前始终检查传入的数据

答案 1 :(得分:-1)

实际上我唯一可以想到的就是将$ _SESSION [' userid']设置为另一个成员ID。假设您正在使用它来检查要显示的成员信息。如果没有设置$ _SESSION [' userid']变量可能最终错误地设置$ _SESSION [' userid'],您是否正在做某事?即如果他们的php会话被重置。