Intereting Posts
Доступ к значениям массива с использованием ключа массива от Twig Laravel создает базу данных при тестировании Получите MIME-тип внешнего файла, используя cURL и php Как преобразовать json закодированный массив PHP в массив в Javascript? Aspect mock не перегружает метод в кодировании PHP: получить строки между строкой A и строкой B (нужно искать несколько строк) Как preg_replace \ "с \" "при хранении в csv-файле с использованием fputcsv обрезание URL-адреса по модулю связи или проблеме форматирования страниц в drupal 7 str_getcsv в многомерный массив в php Тип намека на PHP 7 – массив объектов генерировать «предложения» для пользователей на основе относительной информации от других пользователей Как добавить час во время этой строки datetime? Функция gzopen не существует после того, как я изменил настройку PHP Изменение общего количества и tax_total Woocommerce Настройка переменных открытого класса

PHP-сессии работают очень хорошо, но что-то меня раздражает …

Я работаю с 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() ? И если так, как бы вы это сделали?

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

Related of "PHP-сессии работают очень хорошо, но что-то меня раздражает …"

Похоже, статья была написана в начале 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-адрес также может быть подделан, и поэтому я думаю, что сначала начать сеанс и (восстанавливать любые ранее установленные переменные сеанса).

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