Различные виды аутентификации пользователей на веб-сайтах
[аутентификация пользователей на веб-сайтах]материал подготовил: Александр Феоктистов 27.02.2004
Практически у любого интернет-ресурса рано или поздно появится необходимость в аутентификации пользователей. Если даже рядовые посетители не должны у вас регистрироваться, то для администраторского интерфейса аутентификация нужна, иначе никто не может гарантировать вам безопасность сайта. На самом деле, задача авторизации пользователей далеко не тривиальная, и здесь существует множество способов. Мы рассмотрим самые известные из них и пройдем путь «от простого к сложному», чтобы вы могли выбрать метод, который вам больше всего подходит.
В наших попытках мы возьмем за данность, что на вашем сервере установлено самое популярное ныне программное обеспечение: веб-сервер Apache, компилятор PHP 4 и система управления базами данных MySQL.
Базовая аутентификация Apache
Самый простой способ, не требующий практически никаких усилий от администратора — базовая аутентификация средствами сервера Apache. Для этого нужно сначала создать файл с паролями с помощью утилиты htpasswd, которая находится в каталоге bin сервера. Допустим, вы хотите закрыть паролем раздел http://test.auth/base/, который соответствует локальному каталогу /usr/home/test.auth/www/base/. Для этого вводим команду:
Команда создаст новый файл с паролями и внесет туда пользователя admin, пароль для которого вас попросят ввести здесь же.
После этого вам нужно создать файл конфигурации .htpasswd, в котором вы дадите понять системе, что нужно разрешить вход в каталог определенному пользователю, обозначенному в вашем файле:
AuthType Basic AuthName «Область для избранных» AuthUserFile /usr/home/test.auth/www/base/passwords Require user admin
Теперь, если вы попробуете войти в защищенную область, система попроcит вас ввести имя и пароль. А в поле Require user после пользователя admin через пробел можно добавить еще несколько пользователей, которым будет дан доступ в закрытую область. Вроде бы все работает, но это примитивный способ аутентификации: вы не можете закончить работу, сессия обрывается только после закрытия браузера, а также никак не можете разграничивать права пользователей просто потому, что вы их не знаете. Ниже мы предлагаем вам более продвинутый метод авторизации.
Базовая аутентификация с использованием базы данных
Способ, который сейчас будет описан, во много раз удобнее и лучше предыдущего. Он позволит как впускать только нужных пользователей, так и разграничивать их права, менять пароли и любую личную информацию. Но для этого вам придется разобраться с базой данных MySQL.
Здесь мы не станем рассказывать, как работать с MySQL, потому что этому были посвящены другие материалы на этом сайте. Давайте создадим таблицу users c полями «login», «password» и «fio», после чего добавим в нее несколько записей. Только не забывайте пароль добавлять в виде зашифрованной (MD5) строки. Эти операции удобно производить с помощью системы phpMyAdmin, которая в большинстве случаев установлена на вашем хостинге. После этого на каждую защищаемую страницу (или в файл шаблона) нужно добавить следующие строки:
<? mysql_connect(‘localhost’, ‘root’); mysql_select_db(‘user’); $result = mysql_query(«SELECT * FROM users WHERE login='». $PHP_AUTH_USER. «‘ AND password='». md5($PHP_AUTH_PW). «‘»); if (@mysql_num_rows($result)!=1) { header(«WWW-Authenticate: Basic realm=\»Для избранных\»»); header(«HTTP/1.0 401 Unauthorized»); print(«Чтобы войти в пользовательскую часть сайта, надо ввести имя и пароль.»); print
« login: «.$PHP_AUTH_USER.« password: «.$PHP_AUTH_PW.« md5: «.md5($PHP_AUTH_PW); exit(); };
Данная конструкция определит пользователя, возьмет из базы его имя и «поздоровается» с ним. Разумеется, целью нашей аутентификации было не проявление вежливости, но дальше уже можно делать все, что угодно: определять права пользователя на данный файл (эту информацию тоже можно вписать в базу и брать ее оттуда), отправлять его на личную страницу и так далее. Перед вами открываются все возможности работы с PHP и MySQL. При этом пароль в базе не хранится в открытом виде, и даже в случае кражи зашифрованной строки, подобрать его будет практически невозможно. Средствами PHP можно организовать процедуру изменения личной информации самим пользователем, а администратором, соответственно, всех пользователей. Однако это не тема нашего материала, и заострять внимание на этих операциях мы не станем.
Аутентификация с помощью Cookies
В то время как пользователь заходит на ваш сервер, вы имеете возможность положить к нему на компьютер маленький файл, называемый «Cookie». В другой раз вы сможете скачать его обратно и просмотреть записанную в нем информацию. Это часто используется для того, чтобы «узнавать» пользователя по имени во время разных заходов на сайт. Но наша задача несколько сложнее — нам нужно обеспечить не только «узнавание» пользователя, но и реализовать на основе «cookies» весь механизм аутентификации. Начнем с планирования.
Сразу объясним, что с помощью этого метода мы сможем избавиться от стандартной формы ввода логина и пароля и реализовать все в красивую формочку, аккуратно вписанную в дизайн вашего сайта. После ввода логина и пароля в нее и нажатия кнопки «Submit» пользователю будет отправлен «cookie» c логином и паролем. После этого при входе на каждую защищенную страницу этот файл будет скачиваться, и с помощью MySQL проверяться правильность данных. Разумеется, так как «cookie» — это такой же файл, как и остальные на компьютере пользователя, его можно украсть и прочесть в нем пароль. Поэтому мы должны шифровать его — например, знакомым нам ключом MD5. Правда, и в этом случае будет вероятность кражи «cookie», но если мы сделаем время ее жизни небольшое, а еще лучше, если будем выдавать при каждом входе на страницу новую, то вероятность взлома будет минимальна. В последнем случае нужно будет, разумеется, к паролю добавлять время, чтобы шифрованная строка была все время разной. Мы осуществим только первую часть плана — будем записывать в «cookie» зашифрованный пароль, в большинстве случаев этого будет вполне достаточно.
Ниже идет код php-скрипта, который будет принимать из формы логин и пароль. Они соответственно располагаются в переменных login и password. Задача скрипта проверить правильность ввода данных и выдать пользователю соответствующий «cookie». Кстати, добавьте в вашу базу данных еще одно поле — lastlogin, в нем мы будем хранить время последнего обращения к сайту.
print («Неправильный логин или пароль.»); } else print (mysql_error()); ?>
После этого в каждом защищаемом файле нужно добавить код, который будет проверять правильность пароля, хранимого в «cookie» у пользователя. Если у него нет такого файла, или данные в нем неверны, то посетителя направят на страницу ввода пароля.
$login = $HTTP_COOKIE_VARS[‘oursitelogin’]; $login_result = mysql_query(«SELECT login FROM users WHERE login=’$login’ AND password=’$HTTP_COOKIE_VARS[oursitepass]‘»);
if (!mysql_error() && @mysql_num_rows($login_result)!=1) {
Для того чтобы завершить сессию, пользователь должен нажать на кнопку, которая удалит cookie-файлы и перезагрузит текущую страницу.
Аутентификация с использованием сессий
На низком уровне механизм сессий использует работу с теми же cookies-файлами, но для системного администратора или программиста работа эта более прозрачна и удобна. Сессии позволяют идентифицировать пользователя, а нам с вами останется «прикрутить» к этой структуре только наш модуль аутентификации пользователей.
итак, нам как в прошлом примере нужно создать два скрипта. Первому будет передаваться логин и пароль, а второй будет добавляться ко всем защищенным страницам. И можно еще добавить третий скрипт, который будет осуществлять выход пользователя из системы и подчищать за собой файлы сессий на компьютере пользователя и на сервере. Начинать будем, разумеется, с первого пункта — авторизации. Проверка логина и пароля производится точно таким же образом, как и в предыдущем случае. Только после этого мы не будем создавать cookie-файл, а запустим сессию.
$user_result = mysql_query(«SELECT * FROM users WHERE login=’$login’ AND password='». md5($pass). «‘»);
if (mysql_error()) die(mysql_error());
elseif (@mysql_num_rows($user_result) != 1) $error = «Неверное имя пользователя или пароль.»;
else { $user = mysql_fetch_assoc($user_result);
session_set_cookie_params(1800, «/»); session_start(); session_register(«user»); // Устанавливаем время жизни сессии в 30 минут, стартуем ее и просим запоминать логин и пароль пользователя далее в массиве $user.
header(«Location: /session/index2.php»); };
if (isset($HTTP_COOKIE_VARS[session_name()])) setcookie(session_name()); ?>
Теперь нам нужно на каждую страницу добавить скрипт проверки правильности сессии. В принципе, все аналогично работе с cookie-файлами. Для того чтобы было понятно, я добавлю комментарии в сам код скрипта:
В этом материале мы постарались собрать для вас наиболее популярные и простые способы аутентификации пользователей. Какой из них выбрать — решать вам, тем более что каждый способ снабжен работающим примером скрипта.