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