17.3. Авторизация посетителей сайта
Как правило, авторизация применяется на сайте прежде всего для ограничения доступа пользователей. Это обычно происходит, если вы имеете какую-либо коммерческую информацию, за доступ к которой необходимо платить, или же у вас возникла острая необходимость в использовании пароля для ограничения доступа. В общем, причин для применения авторизации может быть множество, впрочем, как и способов реализации этой задачи. Вопрос авторизации в РНР решается элементарно, как и было сказано ранее. Возможно, что РНР в этом отношении является наиболее удобным языком программирования для начинающих. При полученных знаниях вы также сможете реализовать любую поставленную задачу, связанную с авторизацией. Приведем фрагмент кода для реализации авторизации на практике. Данную программу после проверки на корректность работы вы спокойно можете внедрять в нужные вам файлы, дабы ограничить доступ кпоследним. Время использования этого кода может быть любым вплоть до года и более. Все зависит прежде всего от вас и программной необходимости. Например:
<?
if (!$auth_inc):
$auth_inc = 1;
function auth_Check($realm, $sorry = '', $tmpl= '', $tmp2 = '') {
global $PHP_AUTH_USER;
global $PHP_AUTH_PW;
if {
header("WWW - Authenticate: Basic realm = "$realm"");
header("HTTP/1.0 401 Unauthorized");
if ($sorry == '' )
echo "Вам отказано в доступе!";
else {
include($sorry);
}
exit;
}
else {
if (@authFunction($PHP_AUTH_USER, $PHP_AUTH_PW, $tmp1, $tmp2)) {
$Ok = 1;
}
else {
header("WWW-Authenticate: Basic realm = "$real, "");
header("HTTP/1.0 401 Unauthorized");
if ($sorry == '')
echo "Вам отказано в доступе";
else {
include($sorry);
}
exit;
}
}
}
endif;
?>
Функцию authRinction() пишет сам пользователь, она получает аргументами, соответственно, логин, пароль, введенные посетителем, и два необязательных аргумента по наследству от authFunction() , которая, например, будет проверять пользователя по базе данных и вызывать функцию authCheck() перед каким-либо выводом текста страницы, как было замечено нами в параграфе про функции setcookie() (см. п. 9.8). Написание разных authFunction() позволяет контролировать доступ посетителей из множества различных источников, таких как файлы паролей, СУБД, хэш-файлы, запросы к сетевым сервисам авторизации и др.
Такой тип авторизации самый надежный. При посещении закрытой страницы посетителю выдается диалоговое всплывающее окно с полями имени и пароля. В дальнейшем браузер запоминает $realm и при последующем запросе пароля будет автоматически отправлять серверу пару имя/пароль. Однако это не единственный способ авторизации. Описанную выше систему ведения пользователя вполне можно использоваться в работе, внеся небольшие модификации. Для регистрации создадим форму с полями login и password. Обработчик форм генерирует случайный уникальный ключ и записывает с ним дату/время регистрации в хэш-файл. Вместо даты и времени годится значение функции time(), возвращающей количество секунд с точки отсчета, равной 01.01.1 970. Браузеру клиента выдается cookie, например xfile со значением только что сгенерированного ключа.
Каждая страница, требующая авторизации, должна проверить наличие ключа $xfile в хэш-файле и, если он есть, записать туда время обращения, не затрагивая
время регистрации. Для отказа от авторизации достаточно удалить ключ из базы. Внешняя программа может один раз в полчаса удалять ключи, выданные три часа назад, и ключи, к которым не было обращения в течение одного часа. Стойкость такой системы определяется трудностью подбора ключа cookies за ограниченное время, так как ключи существуют относительно не долго и они достаточно ные. Ключи можно передавать не только через Cookies, но и через URL как параметр скрипта.
Автор сайта должен сам решить, какой алгоритм авторизации сайта он себе выберет.
Введение авторизации — это ключ к созданию электронного магазина, электронной почты, чатов, форумов и т. д.