会话在php中被覆盖

会话在php中被覆盖,php,session,Php,Session,我面临一个问题,我的会话被其他登录php的用户覆盖 当我们有大约50-100个用户的合理负载时,会话开始混淆。例如,如果一个用户在一段时间后以a身份登录,那么他的会话将切换到也已登录的用户B。这个系统已经运行了一年多,这是我们第一次面对这个问题 服务器正在运行Centos 我没有任何代码错误,但不知何故,一个人的数据会被其他人覆盖 请帮助我,因为我试图解决这个错误,但没有成功 是否存在覆盖用户会话数据的php ini设置?或 服务器端是否存在类似会话id随机化不正确的情况 提前感谢。是的,我正在

我面临一个问题,我的会话被其他登录php的用户覆盖

当我们有大约50-100个用户的合理负载时,会话开始混淆。例如,如果一个用户在一段时间后以a身份登录,那么他的会话将切换到也已登录的用户B。这个系统已经运行了一年多,这是我们第一次面对这个问题

服务器正在运行Centos

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

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

是否存在覆盖用户会话数据的php ini设置?或 服务器端是否存在类似会话id随机化不正确的情况


提前感谢。

是的,我正在使用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"; 
    }  
} 
?> 

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

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

第二,由于会话依赖于会话状态提供程序,该提供程序为每个会话创建一个唯一的会话Id,而该会话几乎不可能重新生成[尽管它不是唯一的Id],只需检查您是否正在使用无Cookie会话,在该会话中,您的会话不依赖Cookie,也不依赖URL,这可能会再次引发您的会话


希望它能解决您的问题

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

实现会话劫持也很简单——当用户通过身份验证时,您应该生成一个新的会话id

假设您使用的是默认会话处理程序,则故障不可能出现在会话处理程序代码中。这在数千(数百万?)个应用程序中使用,并且适用于其他所有应用程序

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


C.

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


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

请显示用于初始化会话的代码。是的,正如Unicron所述,这看起来像是个问题在代码中。您是否使用PHP的默认会话处理程序?使用此代码时,您最好注意小Bobby表:当您想添加更多信息时,请编辑您的问题,不要回答它。
mysql\u real\u escape\u string
是您的朋友吗?我已经看到了服务器上创建的会话列表,并找到了一些1位id。是否你知道怎么解决这个问题吗?
<?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
?>
user = "admin' OR ('bla'='"
password="')"