会话在php中被覆盖

时间:2010-07-09 07:44:12

标签: php session

我遇到的问题是我的会话被php中的其他登录用户覆盖了。

当我们有大约50-100个用户的合理负载时,会话开始变得混乱。例如,如果用户在一段时间后登录为A,他的会话将切换到同时登录的用户B.系统已运行一年多,这是我们第一次遇到问题。

服务器正在运行Centos。

我没有任何代码错误,但不知何故,一个人的数据被其他人覆盖。

请帮助我,因为我试图解决这个错误,但没有成功。

是否有任何php ini设置会覆盖用户会话数据?要么 这是服务器端的任何内容,如会话ID随机化是不正确的?

提前致谢。

4 个答案:

答案 0 :(得分:1)

我研究了这个问题,发现在32位的会话文件中创建了一些具有1位id的会话文件。例如。 sess_1和sess_8以及sess_f1d9037025f544376ff0d44511ed3192。

我所看到的是,如果用户A处于空闲状态且用户B登录,则用户A和用户B在其cookie中都有一个额外的PHPSESSID,其中包含一个单比特会话ID,如sess_1。它们仍保留32位PHPSESSID,但是,这些都会从服务器中删除,因此两个用户默认使用相同的会话ID,因此用户A现在可以获得用户B的会话和访问权限。

答案 1 :(得分:0)

是的,我正在使用PHP的默认会话处理程序 我在登录页面中设置了会话变量。

<?php  
session_start(); 
include("dbconfig.php"); 

if($_POST['login']) { 

    $user = $_POST['user']; 
    $pass = $_POST['pass']; 
    $msg = ''; 

    $check = mysql_query("SELECT * FROM `user` WHERE username = '{$user}' AND pass = '{$pass}'") or die(mysql_error()); 
    $row = mysql_num_rows($check); 
    $ck = mysql_fetch_assoc($check); 

    if($row == 1) {       
            $_SESSION['name'] = $user; // used to be set to $ck['iname']; 
            $_SESSION['isadmin'] = 1;            
            $_SESSION['team'] = $ck['teamstatus']; 
            $_SESSION['logintime'] = time(); 
            $_SESSION['priority'] = $ck['priority'];
            $_SESSION['id'] = $ck['id'];
            $_SESSION['designation'] = $ck['designation'];
            $_SESSION['course'] = $ck['course'];
            $_SESSION['year'] = $ck['year'];            
            $_SESSION['no'] = $ck['no'];            
            $_SESSION['div'] = $ck['div'];
            $_SESSION['sp_designation'] = $ck['sp_designation'];      
            header("Location: index.php"); 
            exit;                 
    } else { 
        $msg =  "Invalid Username or Password"; 
    }  
} 
?> 

然后在页面的每个页面顶部,我将验证此人是否已登录

<?php 
session_start(); 

if(!(isset($_SESSION['name'])) && ($_SESSION['isadmin'] == 1) && (isset($_SESSION['id'])) && (isset($_SESSION['designation']))) { 
    header("Location: error.php"); 
    exit; 
} 

otherwise perform the action
?>

答案 2 :(得分:0)

通过阅读您的问题,我认为可能有以下原因:

首先,我建议你,如果你将搜索字符串从一个页面传递到另一个页面,你可以使用查询字符串,因为创建大量的会话变量可能会降低你的应用程序速度。

其次,因为会话依赖于为每个会话创建唯一会话ID的会话状态提供者,而afaik几乎不可能重新生成[尽管它不是普遍唯一的id],只需检查您是否使用cookieless会话,您的会话不依赖于cookie,而是依赖于URL,这可能会重新调用您的会话。

希望它能解决你的问题

答案 3 :(得分:0)

erk,我希望您发布的代码仅用于说明,实施针对它的感染攻击非常容易(例如

user = "admin' OR ('bla'='"
password="')"

实现会话劫持也很简单 - 您应该在用户通过身份验证时生成新的会话ID。

假设您使用的是默认会话处理程序,则错误可能不在会话处理程序代码中。这在数千(数百万?)的应用程序中使用,并且正在为其他所有人工作。

最可能的原因是数据缓存不好 - 你可以在没有任何中间代理的情况下复制它吗?您是否检查了来自网络服务器的标题?

下进行。