Я столкнулся с проблемой, что мой сеанс переписывается другим зарегистрированным пользователем в php.
когда у нас есть разумная нагрузка около 50 -100 пользователей, сеансы начинают смешиваться. Например, если пользователь входит в систему как A через некоторое время, его сеанс переключается на пользователя B, который также вошел в систему. Система работает уже более года, и это первый случай, когда мы сталкиваемся с этой проблемой.
На сервере запущен Centos.
У меня нет никакой ошибки кода в любом месте, но каким-то образом данные переписываются с другими.
Пожалуйста, помогите мне, потому что я пытаюсь решить эту ошибку, но не успех.
Есть ли какая-либо настройка php ini, которая перезапишет данные сеанса пользователя? или Является ли это чем-то на сервере, как рандомизация сеансовой идентификации, не является правильной?
Заранее спасибо.
Я изучил проблему и обнаружил, что несколько файлов сеанса с 1-битным идентификатором создаются среди 32-разрядных. например. sess_1 и sess_8 вместе с sess_f1d9037025f544376ff0d44511ed3192.
То, что я видел, заключается в том, что если пользователь A находится в режиме ожидания и пользователь B входит в систему, то оба пользователя A и пользователя B имеют дополнительный PHPSESSID в своем файле cookie, который содержит один из идентификаторов сеанса с одним битом, например sess_1. Они по-прежнему сохраняют свои 32-разрядные PHPSESSID, однако они удаляются с сервера, поэтому оба пользователя по умолчанию используют один и тот же идентификатор сеанса, и поэтому пользователь A теперь получает сеанс пользователя B и его доступ.
Читая вашу проблему, я думаю, что могут быть следующие причины:
Во-первых, я предлагаю вам, что если вы передаете строку поиска с одной страницы на другую, вы можете использовать querystring, потому что создание большого количества переменных сеанса замедляет скорость вашего приложения.
Во-вторых, поскольку сеанс зависит от поставщика состояния сеанса, который создает уникальный идентификатор сеанса для каждого сеанса, который, afaik, почти невозможно восстановить (хотя это не универсальный уникальный идентификатор), просто проверьте, используете ли вы cookieless-сессию, в которой ваша сессия не зависит от файлов cookie и полагается на URL-адрес, который может повторить ваш сеанс.
Надеюсь, это решит вашу проблему
erk, я надеюсь, что код, который вы опубликовали, только для иллюстрации, было бы очень легко реализовать заражающую атаку против него (например,
user = "admin' OR ('bla'='" password="')"
Его также тривиально реализовать захват сеанса – вы должны генерировать новый идентификатор сеанса, когда пользователь аутентифицируется.
Предполагая, что вы используете обработчик сеанса по умолчанию, ошибка вряд ли будет в коде обработчика сеанса. Это используется тысячами (миллионов?) Приложений и работает для всех остальных.
Скорее всего, причиной является плохое кэширование данных – можете ли вы воспроизвести его в отсутствие промежуточных прокси-серверов? Вы проверили заголовки, выходящие из веб-сервера?
C.
Да, я использую обработчик сеанса по умолчанию 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(); 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 ?>