Иллюстрированный самоучитель по PHP. Авторизация с помощью сессий php


Иллюстрированный самоучитель по PHP › Авторизация доступа › Авторизация с помощью сессий [страница - 52] | Самоучители по программированию

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

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

В связи с этим возникает вопрос: а нельзя ли как-нибудь избежать необходимости каждый раз осуществлять проверку логина и пароля посетителя? Чтобы, единожды авторизовав посетителя, впоследствии предоставлять ему доступ на страницы защищенной зоны без каких-либо проверок? Именно так, кстати, действует защита на основе средств web-сервера – файлов .htaccess, описанная в первом разделе главы. Но можно ли сделать то же самое средствами РНР? Да и вообще использовать cookie для хранения паролей не очень желательно: его содержимое может узнать любой, кто воспользуется компьютером, на котором этот cookie сохранен (многие браузеры хранят cookie в предназначенной для них папке, даже если "время жизни" cookie истекло и он больше не принимается сервером).

Напрашивается первое предложение: а почему бы, например, после успешной авторизации не отправить посетителю cookie с какой-либо пометкой (например, устанавливать в 1 значение переменной в этом cookie), а впоследствии проверять не наличие записанных в cookie логина и пароля в файле паролей или базе данных, а присутствие в cookie этой самой пометки, одинаковой для всех, прошедших авторизацию? Или даже сделать разные типы пометок и в зависимости от типа предоставлять посетителю разные возможности на сайте?

Сделать-то так можно, да вот устойчивость такой системы авторизации к взлому будет не особо великой. Злоумышленнику будет достаточно узнать, что за пометку помещает сценарий авторизации в cookie, чтобы получить к защищенной зоне полный доступ – просто вручную создав такой cookie. (А если при проверке "пометки" использовался не элемент массива $HTTP_COOKIE_VARS, а одноименная переменная, то и просто подставив ее значение в адресной строке при заходе на страницу с такой проверкой: например, page .php?auth=1.) Кроме того, просмотреть значение cookie на компьютере посетителя и узнать, какие его имя и значение являются "пометкой", тоже не так трудно.

Но самое главное – посетители нередко отключают использование cookie при своих путешествиях по Интернету. При отключенных cookie описанная выше система авторизации на их основе работать не будет.

Как же быть?

Следует использовать весьма интересный механизм сессий, появившийся в 4-й версии РНР.

samoychiteli.ru

Читать онлайн Курс "Язык программирования PHP"



Menu Menu Auth Онлайн Библиотека
  • Авторизация
    • VkOdnoklassnikiMailruYandexGoogleFacebook
Поиск Фантастика 6631Детективы и Триллеры 7999Проза 1984Любовные романы 10351Приключения 6321Детское 7564

litra.info

Механизм сессий в PHP

В предыдущей статье мы рассмотрели принцип работы с куки в PHP. Назначение сессий практически такое же — сохранение некоторых данных после завершения работы скрипта для последующего использования. Однако, у двух этих методов есть существенное различие. Куки хранятся на стороне клиента и поэтому пользователь может без труда прочитать и даже изменять их. Допустим, на нашем сайте существует форма авторизации. Войдя под администраторской учетной записью пользователь получает дополнительные привилегии на сайте, к примеру, доступ к администраторской панели. Чтобы после каждого перехода пользователю не вводить заново пароль, необходимо каким-то образом запомнить факт того, что данный пользователь авторизован с административными правами. Используя куки задача решается следующим образом: после удачной авторизации пользователю устанавливается некая куки admin=1. При серфинге по страницам сайта проверяемся, есть ли у пользователя данная куки. Если есть, то пользователь — администратор. С точки зрения безопасности такое решение является в корне неправильным, так как любой посетитель может самостоятельно добавить в своем браузере куки admin=1 и автоматически стать администратором на вашем сайте. Используя сессии такой номер не пройдет, потому что сессионные параметры хранятся на стороне веб-сервера.

Рассмотрим принцип работы сессий в PHP. Для инициализации новой или возобновления ранее созданной необходимо вызвать PHP-функцию session_start(). Данную функцию необходимо вызывать до вывода контента в коде. Сессионные параметры находятся в глобальном массиве $_SESSION. Рассмотрим пример:

session_start(); if ( ! isset($_SESSION['test']) ) { echo 'Сохраняем значение...<br />'; $_SESSION['test'] = 'Hello, world'; } echo $_SESSION['test'];

При первом выполнении скрипта создастся новая сессия функцией session_start(). Условие выполнится, так как сессионной переменной test не существует и при этом будет создана данная сессионная переменная. При последующих выполнениях функция session_start() будет возобновлять ранее созданную сессию, условие выполняться не будет, а будет лишь выводиться значение переменной test.

При создании сессии PHP создает специальный временный файл, в котором хранит сессионные переменные. Для каждой сессии создается отдельный файл. Чтобы определить, какая сессия к какому клиенту относится, при создании сессии клиенту устанавливается куки вида:

PHPSESSID=be9657fa55a93d16d286234faf4ae56b

Это так называемый идентификатор сессии. Существует также способ передачи идентификатора сессии в GET-параметрах, но данный способ я считаю слишком устаревшим. Имя параметра можно изменить в конфигурационном файле PHP php.ini:

session.name = PHPSESSID

По умолчанию сессия уничтожается при закрытии клиентом браузера. Но можно задать и конкретное время жизни сессии в php.ini (указывается время в секундах):

session.cookie_lifetime = 0

В скрипте сессию можно принудительно уничтожить функцией session_destroy().

И напоследок рассмотрим еще один пример. Небольшой скрипт, эмулирующий авторизацию пользователя на сайте. Формы ввода логина и пароля нет, есть просто две кнопки "войти" и "выйти".

<?php   //--Создаем новую либо возобновляем созданную сессию session_start();   //--Процедуры входа и выхода if ( isset($_POST['do']) ) { if ( $_POST['do'] == 'login' ) { $_SESSION['logined'] = 'yes'; header('location: ' . $_SERVER['PHP_SELF']); exit(); } if ( $_POST['do'] == 'logout' ) { session_destroy(); header('location: ' . $_SERVER['PHP_SELF']); exit(); } }   //--Форма авторизации $login_form = <<<END   <form method="POST" action="{$_SERVER['PHP_SELF']}"> <input type="hidden" name="do" value="login" /> <input type="submit" name="submit" value="Войти" /> </form>   END;   //--Форма выхода $logout_form = <<<END   <form method="POST" action="{$_SERVER['PHP_SELF']}"> <input type="hidden" name="do" value="logout" /> <input type="submit" name="submit" value="Выйти" /> </form>   END;   //--Если пользователь авторизован if ( isset($_SESSION['logined']) && $_SESSION['logined'] == 'yes' ) { echo 'Приветствуем Вас, авторизованный пользователь!<br />'; //--Выводим форму выхода echo $logout_form; } else { echo 'Приветствуем Вас, гость!<br />'; //--Выводим форму выхода echo $login_form; }   ?>

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

www.myfirstsite.ru