2016-02-18 2 views
0

Мне удалось получить сеансы, работающие с PHP, однако сеансы объединяются/смешиваются. Если один пользователь входит в систему и посещает определенную страницу, а затем новый пользователь посещает ту же страницу, они переходят к сеансу первого пользователя.PHP Sessions Mixing

Мой код выглядит следующим образом:

session_start(); 
session_id(); 

$rainbow = mysqli_query($db, "SELECT * FROM Users WHERE ID='" . $client->ID . "'"); 
$rainbow = mysqli_fetch_object($rainbow); 
$_SESSION['Username'] = $rainbow->Username; 
$_SESSION['Password'] = $rainbow->Password; 

Каждый раз, когда страница загружена, session_start() называется. Я также использую session_id(), поэтому я не уверен, почему сеансы слияния.

Это становится большой проблемой безопасности.

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

+0

Можете ли вы часть кода, как вы используете session_id()? и как началась сессия? кажется, ваша проблема есть – Armen

+0

session_start(); session_id(); – Lachlan

+0

$ rainbow = mysqli_query ($ db, "SELECT * FROM Users WHERE ID = '". $ Client-> ID. "'"); $ rainbow = mysqli_fetch_object ($ rainbow); $ _SESSION ['Username'] = $ rainbow-> Username; $ _SESSION ['Password'] = $ rainbow-> Пароль; – Lachlan

ответ

1

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

Вы используете переменную под названием $client. Вы получаете от него член, который называется ID. Уверен, что у вас возникла проблема при инициализации $client. Убедитесь, что вы правильно инициализировали $client, он имеет правильный ID для каждого сеанса и что нет возможности для SQL-инъекции.

+0

Я проверил, чтобы клиент был инициализирован правильно, и это так. Как только вы войдете в систему, он по-прежнему отправит вас на чужую сессию, прежде чем она уничтожит ваш сеанс и выйдет из системы. – Lachlan

0

Попробуйте что-нибудь подобное!

if($password === $password_from_database) { 

    $_SESSION['email'] = $email; 
    $_SESSION['okayToken'] = openssl_random_pseudo_bytes(40, "^[email protected]#$m); 
    $_SESSION['loginTime'] = time(); 

} 

Используйте $_SESSION['okayToken'] для отслеживания сеанса!
Никогда не проходите passwords на сеансы. Даже хэши паролей.

0

Я исправил проблему и на данный момент работает. В более позднее время это должно быть более уникальным, хотя.

На данный момент я дал сеансам ключ, который является просто текущей меткой времени UNIX.

Это похоже на то, что сеансы уникальны, но, как я сказал, в будущем это будет скорее рандомизировано, если у двух пользователей будет одна и та же метка времени, которая вернет меня к проблеме слияния, когда сеанс запутывается.