Наличие двух разных сеансов в одном домене

Я запускаю foo.com. У меня есть два разных приложения, которые живут в foo.com: один – foo.com/bar, а другой – foo.com/example. Я использую сеансы для отслеживания информации о пользователе во время входа в систему, но если пользователь переходит с foo.com/bar на foo.com/example, foo.com/example видит сеанс, который пользователь начал с foo.com/ и использует эту информацию. Мой вопрос в том, как я могу одновременно организовать два разных сеанса для каждого каталога?

Вы также можете использовать один и тот же сеанс, но изменить имена переменных, которые вы ищете.

Изменить: Извините, это не отвечает на ваш вопрос, но дает альтернативное решение.

Перед вызовом session_start вы должны вызвать имя session_name. Это устанавливает имя файла cookie, используемого для идентификации сеанса (по умолчанию это PHPSESSID).

Используйте другое имя для каждого приложения. Вам не нужно возиться с переменными внутри сеанса.

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

Я только что тестировал предоставленные решения и отметил, что ни один из них не предотвращает доступ к сеансу, принадлежащему соседнему приложению. Использование разных имен идентификаторов сеанса с именем session_name () не мешает пользователям использовать значение этих идентификаторов. PHP не имеет отдельного хранилища для каждого имени идентификатора сеанса. У меня было два приложения, использующих разные имена сеансов и установив путь к файлу cookie для браузера. В HTTP-ответы были включены следующие соответствующие директивы Set-Cookie:

Set-Cookie: TESTONE=<value one>; path=/testone/ Set-Cookie: TESTTWO=<value two>; path=/testtwo/ 

Если у обоих приложений были совершенно отдельные пользователи, и у кого-то был доступ к /testtwo/ app, они могли бы получить доступ к информации в /testone/ app в зависимости от способа обработки параметров сеанса. Примерный сегмент кода ниже показывает потенциальное нарушение данных, предполагая, что после успешной аутентификации оба приложения используют параметр $_SESSION["authenticated"] .

 <?php session_name("TESTONE"); ini_set("session.cookie_path","/testone/"); session_start(); if ($_SESSION["authenticated"] == "yes") echo $topsecretinfo; ?> 

Чтобы получить доступ к этой $topsecretinfo , нужно только проверить подлинность в /testtwo/ application, взять значение своего TESTTWO сеанса TESTTWO и использовать его как значение TESTONE сеанса TESTONE при отправке запросов в /testone/ application. Процесс поиска в сеансе PHP не распознает имя идентификатора сеанса, за исключением разбора значения соответствия. т.е. значение идентификатора сеанса «agcy648dja6syd8f93» будет возвращать один и тот же объект сеанса независимо от имени, используемого для ссылки на него.

Вы можете использовать session_set_cookie_params для установки домена и папки для сохранения сеанса. IE:

 // Used on foo.com/example session_set_cookie_params(86400, '/example'); // Used on foo.com/bar session_set_cookie_params(86400, '/bar'); 

Другим решением является эффективное создание пространства имен в вашем сеансе, предварительно ожидая все значения сеанса из foo.com/bar с помощью «bar_» ​​и foo.com/example с «example_».

То, как вы можете удержать это от утомительного, – отвлечь эту функциональность от функции или класса. Например:

 function set_session_value($key, $value) { //figure out which prefix to use by checking the current working //directory, or whatever method you like. set $prefix equal to // "bar_" or "example_". $_SESSION[$prefix . $key] = $value; } 

Затем получите значения с соответствующей функцией.

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

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

 if ( $_SERVER['REQUEST_URI'] == '/admin/' ): $session_name = 'session1'; else: $session_name = 'session2'; endif; session_start( $session_name );