Сессии PHP работают очень хорошо, но что-то беспокоит меня ... - PullRequest
0 голосов
/ 27 марта 2011

Я работал с сессиями PHP, и все работает нормально, он делает именно то, что мне нужно.

Затем я начал изучать потенциальные проблемы безопасности и обнаружил следующее:

http://phpsec.org/projects/guide/4.html

Обратите внимание, что все, что использовалось для определения существующего сеанса или нового сеанса 'status', это:

session_start();

... и все же я уже много раз видел подобные вещи:

<?php
if (isset($PHPSESSID))
{
    session_start($PHPSESSID);
}else{
    session_start();
};
?>

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

Однако я уже думал, что у простого session_start() уже есть логика, чтобы определить, был ли сеанс установлен в другом месте, потому что он «знает», чтобы сохранить существующий идентификатор сеанса, а не выдавать новый, если, конечно, это не нужно!

Итак, я проверил вышесказанное и не смог заставить его работать вообще.

<?php
if (isset($PHPSESSID))
{
        $oldsession = "On";
        $newsession = "Off";
        session_start($PHPSESSID);
}
    else
{

    session_start();
    $newsession = "On";
    $PHPSESSID = session_id( );

};

            echo 'ClientSessionID : '.$PHPSESSID.'<br>';
            echo 'Refreshed Session : '.$oldsession.'<br>';
            echo 'New Session : '.$newsession.'<br>';      
?>

Либо я что-то упустил, либо этот код никогда бы не сработал. $oldsession НИКОГДА не получает эхо, даже если сеанс сохраняется. Я делаю вывод, что тест на $PHPSESSID никогда не работает.

Итак, мой вопрос: если предположить, что пример тестового кода синтаксически корректен, возможно ли даже попытаться предварительно определить «статус» сеанса ДО вызова session_start()? И если так, как бы вы поступили?

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

Ответы [ 4 ]

3 голосов
/ 27 марта 2011

Похоже, что статья была написана в начале 2005 года, поэтому, возможно, в статье предполагалось, что параметр register_globals был включен.Ранее в PHP4 он был включен по умолчанию, но в PHP5 он был отключен по умолчанию.

Чтобы ваш код работал, вам нужно явно использовать $_GET['PHPSESSID'] или $_COOKIE['PHPSESSID'], так как глобальныйпеременная $PHPSESSID, вероятно, не установлена ​​из-за отключения register_globals.

Также обратите внимание, что имя сеанса не всегда будет "PHPSESSID."Это значение по умолчанию, но его можно изменить в настройках сервера session.name или изменить в коде во время выполнения с помощью session_name().

1 голос
/ 27 марта 2011

session_start() восстановит активный сеанс, если таковой существует. Вы можете наблюдать это поведение с помощью следующего фрагмента:

<?php

session_start();

echo 'Current session ID: ' . session_id();

$_SESSION['previous_id'] = session_id();
session_regenerate_id();

echo '<br />Session ID on next execution: ' . session_id();

if(isset($_SESSION['previous_id'])) 
  echo '<br />Session ID on previous execution: ' . $_SESSION['previous_id'];

?>

Мудрый сказал остальным.

0 голосов
/ 29 марта 2011

Спасибо Дэ и Уизеги, ваши ответы дали мне подсказку, в которой я нуждался, хотя то, что вы не упомянули, - это аспект безопасности, который привел меня к этой теме.

Чтобы привести в пример примеры, которые я имелнесомненно, был устаревший код того времени, когда register_globals был включен «по умолчанию» и, очевидно, не был обновлен.

Причина, по которой код не может работать сейчас, заключается в том, что regsiter_globals был отключен как настройка по умолчанию в PHP по соображениям безопасности.Начиная с версии 5.3.0 она устарела, и я работал с 5.3.4

. Проблема безопасности, на которую я смотрел, заключалась в том, чтобы определить, был ли пользователь, который использовал сеанс, исходным пользователем, а некто-то подделывает их сеанс, и некоторая информация (IP-адрес) может быть доступна в заголовке даже до того, как вы решите начать сеанс.

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

Как в оригинальной статье!

0 голосов
/ 27 марта 2011

Ваш if (isset ($ PHPSESSID)) не проверяет, что вы думаете.Я не уверен в синтаксисе от руки ... но попробуйте это:

<?php
if (isset(session_id($PHPSESSID)))
{
        $oldsession = "On";
        $newsession = "Off";
        session_start($PHPSESSID);
}
    else
{

    session_start();
    $newsession = "On";
    $oldsession = "None";
    $PHPSESSID = session_id( );

};

            echo 'ClientSessionID : '.$PHPSESSID.'<br>';
            echo 'Refreshed Session : '.$oldsession.'<br>';
            echo 'New Session : '.$newsession.'<br>';      
?>

Я также добавил значение в $ oldsession, чтобы вы могли видеть, что $ PHPSESSID не 'установлен'.1004 *

Надеюсь, это поможет!

Удачи!

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