Я запускаю 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 );