Опубликован: 01.03.2005 | Доступ: свободный | Студентов: 33880 / 4520 | Оценка: 4.31 / 4.06 | Длительность: 16:41:00
ISBN: 978-5-9556-0026-0
Лекция 12:

Авторизация доступа с помощью сессий

< Лекция 11 || Лекция 12: 12345 || Лекция 13 >

Работа с сессиями

Создание сессии

Первое, что нужно сделать для работы с сессиями (если они уже настроены администратором сервера), это запустить механизм сессий. Если в настройках сервера переменная session.auto_start установлена в значение "0" (если session.auto_start=1, то сессии запускаются автоматически), то любой скрипт, в котором нужно использовать данные сессии, должен начинаться с команды

session_start();

Получив такую команду, сервер создает новую сессию или восстанавливает текущую, основываясь на идентификаторе сессии, переданном по запросу. Как это делается? Интерпретатор PHP ищет переменную, в которой хранится идентификатор сессии (по умолчанию это PHPSESSID) сначала в cookies, потом в переменных, переданных с помощью POST- и GET-запросов. Если идентификатор найден, то пользователь считается идентифицированным, производится замена всех URL и выставление cookies. В противном случае пользователь считается новым, для него генерируется новый уникальный идентификатор, затем производится замена URL и выставление cookies.

Команду 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 
?>
Пример 12.2. Создание сессии

Если проделать то же самое с файлом 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(). (Начиная с версии PHP 5.3.0 не рекомендуется для регистрации переменных сессии использовать функцию session_register() ; более того, начиная с версии PHP 6.0.0, эта функция станет недоступна. Вместо этого, для регистрации переменных сессии рекомендуется пользоваться массивом $_SESSION.)

Пример 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); 
    // выводим все переменные сессии
?>
Листинг 12.3a. authorize.php

Теперь, попав на страничку secret_info.php, да и на любую другую страницу сайта, мы сможем работать с введенными пользователем логином и паролем, которые будут храниться в массиве $_SESSION. Таким образом, если изменить код секретной странички (заметьте, мы переименовали ее в secret_info.php) так:

<?php
session_start(); 
    // создаем новую сессию или 
    // восстанавливаем текущую
print_r($_SESSION); 
    // выводим все переменные сессии
?>
<html>
<head><title>Secret info</title></head>
<body>
<p>Здесь я хочу делиться секретами 
с другом Петей.
</body>
</html>
Листинг 12.3b. secret_info.php

То мы получим в браузере на секретной странице следующее:

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>
Листинг 12.3c. 2-я версия secret_info.php
< Лекция 11 || Лекция 12: 12345 || Лекция 13 >
Дарья Федотова
Дарья Федотова
Сергей Березовский
Сергей Березовский

В рамках проф. переподготовки по программе "Программирование"

Есть курсы, которые я уже прошел. Но войдя в курс я вижу, что они не зачтены (Язык Ассемблера и архитектура ЭВМ, Программирование на С++ для профессионалов). Это как?

Алексей Чирук
Алексей Чирук
Украина
Алсу Нржанова
Алсу Нржанова
Россия, г. Орск