Сессия переписывается в php - PullRequest
2 голосов
/ 09 июля 2010

Я столкнулся с проблемой, что моя сессия перезаписывается другим вошедшим пользователем в php.

, когда у нас есть разумная нагрузка около 50 -100 пользовательских сессий, начинающих смешиваться.Например, если пользователь регистрируется как A через некоторое время, его сеанс переключается на пользователя B, который также вошел в систему. Система работает более года, и мы впервые сталкиваемся с проблемой.

На сервере запущен Centos.

У меня нигде нет ошибок кода, но каким-то образом данные перезаписываются другими.

Пожалуйста, помогите мне, потому что я пытаюсь решить эту ошибку, но не удается.

Есть ли какая-либо настройка php ini, которая перезапишет данные сеанса пользователя?Или это что-то на стороне сервера, например, рандомизация идентификатора сеанса неверна?

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 09 июля 2010

Я изучил проблему и обнаружил, что среди 32-битных создаются несколько файлов сессий с 1-битными идентификаторами.например.sess_1 и sess_8 вместе с sess_f1d9037025f544376ff0d44511ed3192.

Что я видел, так это то, что если пользователь A лежит без дела и пользователь B входит в систему, то и пользователь A, и пользователь B имеют дополнительный PHPSESSID в своем файле cookie, который содержит один из идентификаторов сеанса с одним битом, например sess_1.Они по-прежнему сохраняют свои 32-битные PHPSESSID, однако они удаляются с сервера, поэтому оба пользователя по умолчанию используют один и тот же идентификатор сеанса, и поэтому пользователь A теперь получает сеанс пользователя B и свой доступ.

0 голосов
/ 09 июля 2010

Читая вашу проблему, я думаю, что могут быть следующие причины:

Во-первых, я предлагаю вам, если вы передаете строку поиска с одной страницы на другую, вы можете использовать строку запроса, потому что создаете партиипеременной сеанса может замедлить скорость вашего приложения.

Во-вторых, поскольку сеанс зависит от поставщика состояния сеанса, который создает уникальный идентификатор сеанса для каждого сеанса, который, на самом деле, практически невозможно восстановить [хотя он не является универсально уникальнымid], просто проверьте, используете ли вы сеанс без файлов cookie, в котором ваш сеанс не зависит от файлов cookie, а полагаются на URL, который может повторно вызвать сеанс.

Надеемся, что это решит вашу проблему

0 голосов
/ 09 июля 2010

erk, я надеюсь, что код, который вы разместили, только для иллюстрации, было бы действительно легко осуществить атаку на него (например,

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

Это также тривиально для реализации перехвата сеанса - вы должны создать новый идентификатор сеанса, когда пользователь аутентифицирован.

Если вы используете обработчик сеанса по умолчанию, ошибка, скорее всего, не будет в коде обработчика сеанса. Это используется в тысячах (миллионах?) Приложений и работает для всех остальных.

Скорее всего, причиной является плохое кеширование данных. Можете ли вы воспроизвести его в отсутствие промежуточных прокси? Вы проверили заголовки, выходящие из веб-сервера?

С * * +1010

0 голосов
/ 09 июля 2010

Да, я использую обработчик сеанса 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
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...