2010-07-09 4 views
2

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

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

На сервере работает Centos.

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

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

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

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

+1

Plese показать код, который вы используете для инициализации сеанса. – Unicron

+0

Да, как упоминалось в Unicron, это выглядит как проблема (ы) в коде. – codingbear

+0

Используете ли вы обработчик сеанса PHP по умолчанию? – Gumbo

ответ

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 
?> 
+1

С помощью этого кода вам лучше следить за маленькими таблицами Бобби: http://xkcd.com/327/ – Borealid

+3

Пожалуйста, ** отредактируйте ** свой вопрос, когда вы хотите добавить к нему дополнительную информацию, не ** ответить. – Quentin

+0

'mysql_real_escape_string' - ваш друг –

0

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

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

Во-вторых, поскольку сеанс зависит от поставщика состояния сеанса, который создает уникальный идентификатор сеанса для каждого сеанса, который, afaik, практически невозможно восстановить (хотя это не универсальный уникальный идентификатор), просто проверьте, используете ли вы cookieless session, в котором ваш сеанс не зависит от файлов cookie и полагается на URL-адрес, что может повторить ваш сеанс.

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

0

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

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

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

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

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

C.

1

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

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

+0

Я видел список сеансов, созданных на сервере, и нашел некоторые из 1 бит идентификаторов. вы знаете, как решить эту проблему? – user387493