АУТЕНТИФИКАЦИЯ ПОЛЬЗОВАТЕЛЕЙ
Лекция
Подготовлена Прохоровым В.С.
Просьба к пользователю доказать свою личность называется аутентификацией.
Обычный метод аутентификации в Web — это требование к посетителям предоставить уникальное имя пользователя и пароль. Аутентификация используется для разрешения или запрещения доступа к определенным страницам или ресурсам. Аутентификация может быть необязательной либо использоваться для других целей, например, для персонализации.
1. Форма для передачи данных
Пользователь может в удобной форме ввести уникальное имя и пароль с помощью HTML-документа index.html с элементами диалога — текстовыми полями и кнопкой.
Листинг index.html. Страница с формой
Пожалуйста
зарегистрируйтесь
Зарегистрировавшись, Вы получите доступ к защищенной странице.
Имя и Пароль можно получить у администратора.
Имя:
Пароль:
а1ue = Отправить>
После того как пользователь заполнит текстовые поля и нажмет кнопку «Отправить», браузер обратится к сценарию hello.php и передаст их в строке параметров. В атрибуте action тега задан относительный путь, т. е. сценарий hello.php будет искаться браузером в том же самом каталоге, что и файл form.html.
Осталось определиться, как можно извлечь $login и $pass из строки параметров.
2. Трансляция полей формы
Независимо от того, каким методом — get или post — воспользовался браузер, РНР сам определяет, какой метод был задействован.
Все данные из полей формы РНР помещает в глобальный массив $_REQUEST.
Значение поля login будет храниться в $_REQUEST["login"], а значение поля pass — в $_REQUEST["pass"].
Чтобы можно было как-то разделить GET-параметры от POST-данных, РНР также создает массивы $_GET и $_POST, заполняя их соответствующими значениями. Массив $_REQUEST представляет собой объединение этих двух массивов.
Листинг hello.php - сценарий извлечения текста из полей формы
if ($_REQUEST["login"]=="root" && $_REQUEST["pass"]=="Z10N0101")
{
echo "Доступ открыт для пользователя $_REQUEST[login]";
}
else
{
echo "Доступ закрыт! При вводе данных была совершена ошибка. Для исправления ошибки нужно вернуться <a href=index.html>назадa>";
}
?>
При создании сценария извлечения текста из полей формы hello.php применена инструкция if-else.
Инструкция if-else — условный оператор. Его формат таков:
if (логическое_выражение)
инструкция_1;
else
инструкция_2;
Действие инструкции следующее: если логическое_выражение истинно, то выполняется инструкция_1, а иначе — инструкция_2.
Как и в любом другом языке, конструкция else может опускаться. В этом случае при получении ложного значения просто ничего не делается.
Если при вводе данных будет совершена ошибка, например, неправильно введен пароль, то доступ будет закрыт:
Рассмотренный код, реализует простой механизм, позволяющий санкционированным посетителям видеть защищенную страницу.
Этот сценарий:
● поддерживает только одно жестко закодированное имя пользователя и пароль;
● хранит пароль в виде простого текста;
● защищает только одну страницу;
● передает пароль в виде простого текста.
3. Хранение паролей
Для хранения паролей лучше применить базу данных. Если планируется сохранять большое количество элементов в файле или производить поиск в рамках большого числа элементов, то следует рассмотреть возможность использования базы данных вместо двумерного файла.
Практический метод выбора между файлом и базой данных гласит: если вы собираетесь хранить и производить поиск в более чем 100 элементах, следует отдать предпочтение базе данных.
Использование базы данных для хранения имен и паролей посетителей позволяет быстро проводить аутентификацию множества пользователей. Это также упрощает создание сценария для добавления и удаления пользователей, а также дает возможность пользователям изменять свои пароли.
Разработаем сценарий для аутентификации посетителей страницы с использованием базы данных.
Базу данных auth и таблицу auth в ней можно создать, подключившись к MySQL как пользователь root и запустив показанный в листинге create_db.php сценарий.
Листинг create_db.php —запросы для создания базы данных auth с таблицей auth
//Создаем базу данных MySQL
//Открыть постоянное соединение с с MySQL-сервером, сервер localhost,
//имя пользователя root, пустой пароль
$link = mysql_pconnect("localhost", "root", "")
or exit("Соединение с MySQL-сервером не создано");
//отправляем запрос текущей активной БД на сервере и
//и создаем базу данных auth
$result=mysql_query("create database auth");
if(!$result) echo"База данных не создана";
//Выбираем БД MySQL auth
$result=mysql_select_db("auth");
if(!$result) echo"База данных не выбрана";
//отправляем MySQL-запрос/query и
//создаем таблицу auth в базе данных auth
$result=mysql_query("create table auth
(
name varchar(16) NOT NULL "",
pass varchar(16) NOT NULL "",
PRIMARY KEY (name)
)TYPE=MyISAM");
if($result)
echo "Таблица auth создана
";
//отправляем запрос текущей активной БД на сервере и
//создаем список привилегий,
//которые могут быть применены ко всем таблицам базы данных auth
//пользователем admin с хоста localhost с паролем 12345
$result=mysql_query("grant select, insert, update, delete
on auth.*
to admin@localhost identified by "12345";
");
if($result) echo "Привилегии созданы";
?>
Далее следует определить пользователей, которым будет предоставлен доступ к защищенным ресурсам. Для этого нужно присвоить им login и pass. Создадим двух таких пользователей (оставим прежнего root и добавим нового testuser):
use auth;
insert into auth values
("root", "Z10N0101");
insert into auth values
("testuser", "test123");
Листинг index_1.html - страница с формой для улучшения механизма аутентификации из-за применения MySQL.
Пожалуйста
зарегистрируйтесь
Зарегистрировавшись, Вы получите доступ к защищенной странице.
Имя и Пароль можно получить у администратора.
Имя:
Пароль:
а1ue = Отправить>
Листинг secretdb.php — сценарий извлечения текста из полей формы и сравнение его с текстом из базы данных
if(!isset($_POST["login"])&&!isset($_POST["pass"]))
{
//Посетитель должен ввести имя и пароль
?>
Пожалуйста
зарегистрируйтесь
Зарегистрировавшись, Вы получите доступ к защищенной странице.
Имя и Пароль можно получить у администратора.
Имя:
Пароль:
а1ue = Отправить>
}
else
{
//Подключиться к MySQL
$mysql=mysql_connect("localhost","root","");
if(!$mysql)
{
echo "К базе данных не удалось подключиться.";
exit;
}
//Выбрать нужную базу данных
$mysql = mysql_select_db( "auth" );
if(!$mysql)
{
echo "Нужную базу данных не удалось выбрать.";
exit;
}
//Запрос к базе данных для проверки, существует ли соответствующая запись
$query = "select count(*) from auth where
login = $_POST["login"] and
pass = $_POST["pass"]";
$result = mysql_query($query);
if(!$result)
{
echo "Запрос к базе данных не может быть осуществлен.";
exit;
}
$count = mysql_result( $result, 0, 0 );
if ( $count > 0 )
{
//Комбинация имени и пароля посетителя правильная
echo "<h1> Эта страница для зарегистрированных пользователей!h1>";
echo " Мы рады тому, что Вы посетили нашу страничку.";
}
else
{
// Комбинация имени и пароля посетителя неправильная
echo "<h1> ВНИМАНИЕ!h1>";
echo " Вы ввели неправильно имя и пароль.";
}
}
?>
Проверка того, что пользователь ввел данные, осуществляется функцией isset.
При создании сценария извлечения текста из полей формы hello.php применена инструкция if-else.
Инструкция if-else — условный оператор. Его формат таков:
if (логическое_выражение)
инструкция_1;
else
инструкция_2;
Действие инструкции следующее: если логическое_выражение истинно, то выполняется инструкция_1, а иначе — инструкция_2.
Как и в любом другом языке, конструкция else может опускаться. В этом случае при получении ложного значения просто ничего не делается.
В качестве логического выражения применена логическая функция isset, которая проверяет, установлена ли переменная, логический оператор для проверки булевых условий НЕ (!) и И (and или &&):
(!isset($_POST ["login"])&&!isset($_POST ["pass"]))
Листинг secretdb.php — применение MySQL для улучшения механизма аутентификации.
$name = $_POST["name"]
$password = $_POST["password"]
if(!isset($name)&&!isset($password))
{
//Если имя и пароль не существуют, посетитель должен зарегистрироваться, т.е. ввести имя и пароль
?>
<h1>Пожалуйста зарегистрируйтесьh1>
<p>Зарегистрировавшись, Вы получите доступ к защищенной странице.p>
Имя
Пароль
}
else
{
//Подключиться к MySQL
$mysql = mysql_connect( "localhost", "root", "" );
if(!$mysql)
{
echo " К базе данных не удалось подключиться.";
exit;
}
//Выбрать нужную базу данных
$mysql = mysql_select_db( "auth" );
if(!$mysql)
{
echo " Нужную базу данных не удалось выбрать.";
exit;
}
//Запрос к базе данных, чтобы проверить, существует ли соответствующая запись
$query = "select count(*) from auth where
name = "$name" and
pass = "$password"";
$result = mysql_query( $query );
if(!$result)
{
echo " Запрос к базе данных не может быть осуществлен.";
exit;
}
$count = mysql_result( $result, 0, 0 );
if ( $count > 0 )
{
//Комбинация имени и пароля посетителя правильная
echo "<h1> Эта страница для зарегистрированных пользователей!h1>";
echo " Мы рады тому, что Вы посетили нашу страничку.";
}
else
{
// Комбинация имени и пароля посетителя неправильная
echo "<h1> ВНИМАНИЕ!h1>";
echo " Вы ввели неправильно имя и пароль.";
}
}
?>
Используемую в примере базу данных можно создать, подключившись к MySQL как пользователь root и запустив показанный в листинге 14.3 сценарий.
Листинг 14.3. createauthdb.php —запросы для создания базы данных auth, таблицы auth и двоих пользователей.
create database auth;
use auth;
create table auth (
name varchar(10) not null,
pass varchar(30) not null,
primary key (name)
);
insert into auth values
("user", "pass");
insert into auth values
( "testuser", password("test123") );
grant select, insert, update, delete
on auth.*
to webauth@localhost
identified by "webauth";