Передача идентификатора сессии


Существуют два метода передачи идентификатора сессии:

  • Cookies
  • Параметр URL

Модуль сессии поддерживает оба метода. Метод с cookies является оптимальным, но он не всегда доступен. Поэтому PHP предоставляет второй способ, который внедряет идентификатор сессии непосредственно в URL.

PHP умеет преобразовывать ссылки прозрачно. Однако, если вы используете версию PHP младше 4.2.0, вам следует включить эту возможность вручную при сборке PHP. Под UNIX следует передать конфигуратору опцию --enable-trans-sid. Если эта опция сборки и опция времени исполнения session.use_trans_sid включены, в относительные URI будут автоматически добавляться идентификаторы сессии.

Замечание:

Директива arg_separator.output из php.ini позволяет настраивать разделитель аргументов. Для полной совместимости с XHTML следует указывать &.

В качестве альтернативы вы можете использовать константу SID, которая устанавливается при запуске сессии. Если клиентское ПО не хранит подходящую сессионную cookie, SID имеет вид session_name=session_id. В противном случае содержит пустую строку. Таким образом, вы можете в любом случае внедрять его в URL.

Приведенный ниже пример демонстрирует, как зарегистрировать переменную и как правильно построить ссылку на другую страницу, используя SID.

Пример #1 Подсчет количества посещений конкретного пользователя

<?php

session_start
();

if (empty(
$_SESSION['count'])) {
   
$_SESSION['count'] = 1;
} else {
   
$_SESSION['count']++;
}
?>

<p>
Здравствуйте, посетитель, вы видели эту страницу <?php echo $_SESSION['count']; ?> раз.
</p>

<p>
<a href="nextpage.php?<?php echo htmlspecialchars(SID); ?>">Нажмите
сюда</a>, чтобы продолжить.
</p>

Функция htmlspecialchars() может использоваться для вывода SID с целью предотвращения XSS-аттак.

Вывод SID способом, показанном выше, не является обязательным, если опция --enable-trans-sid была использована при компиляции PHP.

Замечание:

Подразумевается, что неотносительные URL указывают только на внешние сайты и потому SID к ним не добавляется, так как это увеличивало бы риски в области безопасности, в частности, риск утечки SID другому серверу.