我遇到的问题是我的会话被php中的其他登录用户覆盖了。
当我们有大约50-100个用户的合理负载时,会话开始变得混乱。例如,如果用户在一段时间后登录为A,他的会话将切换到同时登录的用户B.系统已运行一年多,这是我们第一次遇到问题。
服务器正在运行Centos。
我没有任何代码错误,但不知何故,一个人的数据被其他人覆盖。
请帮助我,因为我试图解决这个错误,但没有成功。
是否有任何php ini设置会覆盖用户会话数据?要么 这是服务器端的任何内容,如会话ID随机化是不正确的?
提前致谢。
答案 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。
假设您使用的是默认会话处理程序,则错误可能不在会话处理程序代码中。这在数千(数百万?)的应用程序中使用,并且正在为其他所有人工作。
最可能的原因是数据缓存不好 - 你可以在没有任何中间代理的情况下复制它吗?您是否检查了来自网络服务器的标题?
下进行。