Команду session_start() нужно вызывать во всех скриптах, в которых предстоит использовать переменные сессии, причем до вывода каких-либо данных в браузер. Это связано с тем, что cookies выставляются только до вывода информации на экран.
Получить идентификатор текущей сессии можно с помощью функции session_id().
Для наглядности сессии можно задать имя с помощью функции session_name([имя_сессии]). Делать это нужно еще до инициализации сессии. Получить имя текущей сессии можно с помощью этой же функции, вызванной без параметров: session_name();
Пример 12.2. Создание сессии
Переименуем наш файл index.html, чтобы обрабатывались php-скрипты, например в Index.php, создадим сессию и посмотрим, какой она получит идентификатор и имя.
<?
session_start();
// создаем новую сессию или
// восстанавливаем текущую
echo session_id();
// выводим идентификатор сессии
?>
<html>
<head><title>My home page</title></head>
... // домашняя страничка
</html>
<?
echo session_name();
// выводим имя текущей сессии.
// В данном случае это PHPSESSID
?>
Если проделать то же самое с файлом authorize.php, то значения выводимых переменных (id сессии и ее имя) будут такими же, если перейти на него с index.php и не закрывать перед этим окно браузера (тогда идентификатор сессии изменится).
Регистрация переменных сессии
Однако от самих идентификатора и имени сессии нам пользы для решения наших задач немного. Мы же хотим передавать и сохранять в течение сессии наши собственные переменные (например, логин и пароль). Для того чтобы этого добиться, нужно просто зарегистрировать свои переменные:
session_register(имя_переменной1,
имя_переменной2, ...);
Заметим, что регистрируются не значения, а имена переменных. Зарегистрировать переменную достаточно один раз на любой странице, где используются сессии. Имена переменных передаются функции session_register() без знака $. Все зарегистрированные таким образом переменные становятся глобальными (т.е. доступными с любой страницы) в течение данной сессии работы с сайтом.
Зарегистрировать переменную также можно, просто записав ее значение в ассоциативный массив $_SESSION, т.е. написав
$_SESSION['имя_переменной'] =
'значение_переменой';
В этом массиве хранятся все зарегистрированные (т.е. глобальные) переменные сессии.
Доступ к таким переменным осуществляется с помощью массива $_SESSION['имя_переменной'] (или $HTTP_SESSION_VARS['имя_переменной'] для версии PHP 4.0.6 и более ранних). Если же в настройках php включена опция register_globals, то к сессионным переменным можно обращаться еще и как к обычным переменным, например так: $имя_переменной.
Если register_globals=off (отключены), то пользоваться session_register() для регистрации переменных переданных методами POST или GET, нельзя, т.е. это просто не работает. И вообще, не рекомендуется одновременно использовать оба метода регистрации переменных, $_SESSION и session_register().
Пример 12.3. Регистрация переменных
Зарегистрируем логин и пароль, вводимые пользователем на странице авторизации.
<?
session_start();
// создаем новую сессию или
// восстанавливаем текущую
if (!isset($_GET['go'])){
echo "<form>
Login: <input type=text name=login>
Password: <input type=password
name=passwd>
<input type=submit name=go value=Go>
</form>";
}else {
$_SESSION['login']=$_GET['login'];
// регистрируем переменную login
$_SESSION['passwd']=$_GET['passwd'];
// регистрируем переменную passwd
// теперь логин и пароль - глобальные
// переменные для этой сессии
if ($_GET['login']=="pit" &&
$_GET['passwd']=="123") {
Header("Location: secret_info.php");
// перенаправляем на страницу
// secret_info.php
}else echo "Неверный ввод,
попробуйте еще раз<br>";
}
print_r($_SESSION);
// выводим все переменные сессии
?>
Теперь, попав на страничку secret_info.php, да и на любую другую страницу сайта, мы сможем работать с введенными пользователем логином и паролем, которые будут храниться в массиве $_SESSION. Таким образом, если изменить код секретной странички (заметьте, мы переименовали ее в secret_info.php) так:
<?php
session_start();
// создаем новую сессию или
// восстанавливаем текущую
print_r($_SESSION);
// выводим все переменные сессии
?>
<html>
<head><title>Secret info</title></head>
<body>
<p>Здесь я хочу делиться секретами
с другом Петей.
</body>
</html>
То мы получим в браузере на секретной странице следующее:
Array ( [login] => pit [passwd] => 123 )
Здесь я хочу делиться секретами
с другом Петей.
В итоге получим список переменных, зарегистрированных на authorize.php и, собственно, саму секретную страничку.
Что это нам дает? Допустим, хакер хочет прочитать секреты Васи и Пети. И он как-то узнал, как называется секретная страничка (или странички). Тогда он может попытаться просто ввести ее адрес в строке браузера, минуя страницу авторизации (ввода пароля). Чтобы избежать такого проникновения в наши тайны, нужно дописать всего пару строк в код секретных страничек:
<?php
session_start();
// создаем новую сессию или
// восстанавливаем текущую
print_r($_SESSION);
// выводим все переменные сессии
if (!($_SESSION['login']=="pit" &&
$_SESSION['passwd']==123))
// проверяем правильность
// пароля-логина
Header("Location: authorize.php");
// если ошибка, то перенаправляем на
// страницу авторизации
?>
<html>
<head><title>Secret info</title></head>
... // здесь располагается
//секретная информация :)
</html>
Удаление переменных сессии
Кроме умения регистрировать переменные сессии (т.е. делать их глобальными на протяжении всего сеанса работы), полезно также уметь удалять такие переменные и сессию в целом.