Наличие двух разных сессий в одном домене - PullRequest
10 голосов
/ 28 августа 2009

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

Ответы [ 6 ]

43 голосов
/ 28 августа 2009

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

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

4 голосов
/ 15 декабря 2016

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

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

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

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

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

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

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

2 голосов
/ 28 августа 2009

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

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

2 голосов
/ 28 августа 2009

Возможно, вы сможете использовать 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');
0 голосов
/ 31 октября 2012

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

if ( $_SERVER['REQUEST_URI'] == '/admin/' ):
    $session_name = 'session1';
else:
    $session_name = 'session2';
endif;
session_start( $session_name );
0 голосов
/ 28 августа 2009

Другое решение состоит в том, чтобы эффективно создать пространство имен в вашем сеансе, предварительно ожидая всех значений сеанса с 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;
}

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

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

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