Я работаю с PHP-сессиями, и все работает нормально, это делает именно то, что мне нужно.
Затем я начал изучать потенциальные проблемы безопасности и нашел это:
http://phpsec.org/projects/guide/4.html
Обратите внимание, что все, что было использовано, это определить существующий сеанс или статус нового сеанса:
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
NEVER получает echo'ed, даже если сессия сохраняется. Я пришел к выводу, что тест на $PHPSESSID
никогда не работает.
Поэтому мой вопрос: если исходный тестовый код синтаксически корректен, возможно ли даже пытаться предварительно определить статус сеанса? ПЕРЕД вызовом session_start()
? И если так, как бы вы это сделали?
Как будет показано в статье, использование (предполагаемых) итоговых переменных сеанса после запуска сеанса является единственным способом отправки кода в другом направлении, поэтому я думаю, что на самом деле это единственный способ сделать это.
Похоже, статья была написана в начале 2005 года, поэтому, возможно, в этой статье предполагается, что параметр register_globals
включен. Ранее в PHP4 он был включен по умолчанию, но по умолчанию он был отключен в PHP5.
Для того, чтобы ваш код работал, вам нужно явно использовать $_GET['PHPSESSID']
или $_COOKIE['PHPSESSID']
, поскольку глобальная переменная $PHPSESSID
, вероятно, не установлена из-за $PHPSESSID
register_globals
.
Также обратите внимание, что имя сеанса не всегда будет «PHPSESSID». Это значение по умолчанию, но оно может быть изменено в настройке сервера session.name
или изменено в коде во время выполнения с session_name()
.
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']; ?>
Мудрый сказал остальным.
Ваш 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 не установлен.
Надеюсь, это поможет!
Удачи!
Спасибо Dae и Wiseguy, ваши ответы дали мне подсказку, в которой я нуждался, хотя то, о чем вы не упоминали, было аспектом безопасности, что и привело меня к теме.
Чтобы привести в контекст, примеры, которые я видел, несомненно, были устаревшим кодом с момента, когда register_globals был включен «по» по умолчанию и явно не обновлялся.
Причина, по которой код теперь не может работать, заключается в том, что regsiter_globals отключен как параметр по умолчанию в PHP по соображениям безопасности. По состоянию на 5.3.0 он устарел, и я работал с 5.3.4
Проблема с безопасностью, на которую я смотрел, была методом определения того, был ли пользователь, который использовал сеанс, оригинальным пользователем, а не тем, кто подделывает их сеанс, а часть информации (IP-адрес) может быть доступна в заголовке еще до вас решите начать сеанс.
Но теперь я узнаю, что IP-адрес также может быть подделан, и поэтому я думаю, что сначала начать сеанс и (восстанавливать любые ранее установленные переменные сеанса).
Как в оригинальной статье!