Опубликован: 01.03.2005 | Уровень: для всех | Доступ: свободно
Лекция 12:

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

< Лекция 11 || Лекция 12: 12345 || Лекция 13 >
Аннотация: Лекция посвящена изучению вопросов обеспечения безопасности в сети и использованию для этих целей механизма сессий. Рассматриваются: инициализация сессий, передача идентификатора пользователя, регистрация переменных сессии, уничтожение сессии. Также рассматривается настройка сессий в файлах php.ini, httpd.conf, .htaccess. В завершение приводится пример авторизации пользователя с помощью механизма сессий.

В этой лекции мы разберем, что такое сессии и в чем их специфика в PHP, решим одну из основных задач, возникающих при построении более-менее сложных информационных систем (сайтов) - задачу авторизации доступа пользователей к ресурсам системы, а также обсудим безопасность построенного решения.

Авторизация доступа

Что такое авторизация доступа? Попробуем объяснить на примере из обычной жизни. Вы хотите взять в библиотеке книгу. Но эта услуга доступна только тем, у кого есть читательский билет. Можно сказать, что с помощью этого билета производится "авторизация доступа" к библиотечным ресурсам. Библиотекарь после предъявления ему читательского билета знает, кто берет книгу, и в случае необходимости (например, книгу долго не возвращают) может принять меры (позвонить должнику домой). Библиотекарь имеет гораздо больше прав, чем обычный посетитель: он может давать или не давать книги определенному посетителю, может выставлять напоказ новинки и убирать в архив редко читаемые книги и т.п.

В информационных технологиях все примерно так же. В сети существует огромное количество ресурсов, т.е. множество "библиотек". У каждой из них свой "библиотекарь", т.е. человек или группа людей, отвечающих за содержание ресурса и предоставление пользователям информации. Их называют администраторами. Функции администратора, как правило, включают добавление новой информации, удаление и редактирование существующей, настройка способов отображения информации пользователю. А в функции пользователя (простого посетителя ресурса) входит только поиск и просмотр информации.

Как же отличить пользователя от администратора? В реальной библиотеке это как-то очевидно, но если роли библиотекаря и посетителя библиотеки перенести в виртуальную реальность, то эта очевидность исчезает. Библиотекарь, как и посетитель, имеет доступ к библиотечным ресурсам через Internet. А согласно протоколу HTTP все клиенты абсолютно равноправны. Как же понять, кто зашел на сайт? Обычный пользователь (посетитель) или администратор (библиотекарь)? Если это простой пользователь, то как сохранить это знание, чтобы не допустить посетителя в закрытые архивы сайта? То есть возникает вопрос, как идентифицировать клиента, который послал запрос, и сохранять сведения о нем, пока он находится на сайте?

Самый простой вариант, который приходит в голову, - это регистрация человека в системе и выдача ему аналога читательского билета, а именно логина и пароля для входа в административную часть системы. Эта информация хранится на компьютере-сервере, и при входе в систему проверяется соответствие введенных пользователем логина и пароля тем, что хранятся в системе. Правда, здесь по сравнению с реальной библиотекой ситуация изменяется: читательский билет требуется библиотекарю для входа в закрытую часть системы, а читатель может заходить на сайт свободно. В принципе можно регистрировать и простых посетителей. Тогда всех зарегистрированных пользователей нужно разделить на группы: библиотекари (администраторы) и читатели (простые пользователи), наделив их соответствующими правами. Мы не будем вдаваться в эти тонкости и воспользуемся самым простым вариантом, когда ввод логина и пароля требуется для доступа к некоторым страницам сайта.

Пример 12.1.

У нас имеется файл index.html - домашняя страничка Васи Петрова

<html>
<head><title>My home page</title></head>
<body>
Привет всем! 
Меня зовут Вася Петров и 
это моя домашняя страничка.
<a href="secret_info.html">Для Пети</a>
</body></html>
Листинг 12.1. Домашняя страничка Васи Петрова

и файл secret_info.html, который содержит секретную информацию, читать которую разрешено только Васиному другу Пете.

<html>
<head><title>Secret info</title></head>
<body>
<p>Здесь я хочу делиться секретами 
с другом Петей.</p>
</body></html>
Листинг 12.1a. secret_info.html

Если оставить оба эти файла как есть, то любой посетитель, кликнув на ссылку "Для Пети", попадет на секретную страничку. Чтобы этого избежать, нужно добавить промежуточный скрипт, который будет проверять, действительно ли Петя хочет попасть на секретную страничку. И сделать так, чтобы главный файл ссылался не сразу на secret_info.html, а сначала на этот скрипт.

<html>
<head><title>My home page</title></head>
<body>
<p>Привет всем! 
Меня зовут Вася Петров и 
это моя домашняя страничка.
</p>
<a href="authorize.php">Для Пети</a>
</body>
</html>
Листинг 12.1b. Index.html

Сам скрипт авторизации должен предоставлять форму для ввода логина и пароля, проверять их правильность и перенаправлять на секретную страничку, если проверка прошла успешно, и выдавать сообщение об ошибке в противном случае.

<?
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 { 
// если форма заполнена, то сравниваем логин
// и пароль с правильными логином и  паролем
    if ($_GET['login']=="pit" && 
        $_GET['passwd']=="123") { 
    Header("Location: secret_info.html");
    //и перенаправляем на секретную страницу
    }else echo "Неверный ввод, 
                попробуйте еще раз<br>";
}
?>
Листинг 12.1c. authorize.php

Вроде бы все достаточно просто. Но допустим, у нас не одна секретная страничка, а несколько. Причем они связаны между собой перекрестными ссылками. Тогда возникает необходимость постоянно помнить пароль и логин посетителя сайта (если он таковой имеет). Чтобы решить эту проблему, можно в каждую страницу встроить скрипт, который будет передавать логин и пароль от страницы к странице в качестве скрытых параметров формы. Но такой способ не совсем безопасен: эти параметры можно перехватить и подделать. В PHP существует более удобный и безопасный метод решения проблемы хранения данных о посетителе в течение сеанса его работы с сайтом - это механизм сессий.

< Лекция 11 || Лекция 12: 12345 || Лекция 13 >
Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

как я получу диплом о профессиональной переподготовке?

Сергей Крупко
Сергей Крупко

Добрый день.

Я сейчас прохожу курс  повышения квалификации  - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?