Вопрос:

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

php

19936 просмотра

6 ответа

2976 Репутация автора

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

Автор: Matthew Источник Размещён: 28.08.2009 06:07

Ответы (6)


2 плюса

7506 Репутация автора

Вы можете использовать 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');
Автор: Steven Surowiec Размещён: 28.08.2009 06:15

1 плюс

1840 Репутация автора

Решение

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

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

Автор: user103219 Размещён: 28.08.2009 06:18

0 плюса

0 Репутация автора

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

Автор: eryno Размещён: 28.08.2009 06:48

44 плюса

4450 Репутация автора

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

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

Автор: Craig Размещён: 28.08.2009 06:51

0 плюса

76 Репутация автора

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

if ( $_SERVER['REQUEST_URI'] == '/admin/' ):
    $session_name = 'session1';
else:
    $session_name = 'session2';
endif;
session_start( $session_name );
Автор: Trevor Lettman Размещён: 31.10.2012 04:24

4 плюса

196 Репутация автора

Я думаю, что очень важно подчеркнуть потенциальные последствия для безопасности, связанные с решениями, предоставленными до сих пор. Я был тестером проникновения веб-приложений около 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» будет возвращать один и тот же объект сеанса независимо от имени, используемого для ссылки на него.

Автор: SomeGuy Размещён: 15.12.2016 12:29
Вопросы из категории :
32x32