АУТЕНТИФИКАЦИЯ ПОЛЬЗОВАТЕЛЕЙ
Лекция
Подготовлена Прохоровым В.С.
Просьба к пользователю доказать свою личность называется аутентификацией.
Обычный метод аутентификации в Web -- это требование к посетителям предоставить уникальное имя пользователя и пароль. Аутентификация используется для разрешения или запрещения доступа к определенным страницам или ресурсам. Аутентификация может быть необязательной либо использоваться для других целей, например, для персонализации.
Пользователь может в удобной форме ввести уникальное имя и пароль с помощью HTML-документа index.html с элементами диалога -- текстовыми полями и кнопкой.
Листинг index.html. Страница с формой
<html>
<head>
<title>АУТЕНТИФИКАЦИЯ ПОЛЬЗОВАТЕЛЯ</title>
</head>
<body>
<h1>Пожалуйста зарегистрируйтесь</h1>
<p>Зарегистрировавшись, Вы получите доступ к защищенной странице.</p>
<p>Имя и Пароль можно получить у администратора.</p>
<form action=hello.php>
Имя: <input type=text name=login> <br>
Пароль: <input type=password name=pass> <br>
<input type=submit vа1ue = Отправить><br>
</form>
</body>
</html>
После того как пользователь заполнит текстовые поля и нажмет кнопку «Отправить», браузер обратится к сценарию hello.php и передаст их в строке параметров. В атрибуте action тега <form> задан относительный путь, т. е. сценарий hello.php будет искаться браузером в том же самом каталоге, что и файл form.html.
Осталось определиться, как можно извлечь $login и $pass из строки параметров.
Независимо от того, каким методом -- get или post -- воспользовался браузер, РНР сам определяет, какой метод был задействован.
Все данные из полей формы РНР помещает в глобальный массив $_REQUEST.
Значение поля login будет храниться в $_REQUEST['login'], а значение поля pass -- в $_REQUEST['pass'].
Чтобы можно было как-то разделить GET-параметры от POST-данных, РНР также создает массивы $_GET и $_POST, заполняя их соответствующими значениями. Массив $_REQUEST представляет собой объединение этих двух массивов.
Листинг hello.php - сценарий извлечения текста из полей формы
<?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;
инструкция_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))
//Если имя и пароль не существуют, посетитель должен зарегистрироваться, т.е. ввести имя и пароль
<form method = post action = "secretdb.php">
<table border = 1>
<tr>
<th>Имя</th>
<td> <input type = text name = name> </td>
</tr>
<th>Пароль</th>
<td> <input type = password name = password> </td>
<td colspan =2 align = center>
<input type = submit value = "Вход">
</td>
</table>
//Подключиться к MySQL
$mysql = mysql_connect( 'localhost', 'root', '' );
if(!$mysql)
echo ' К базе данных не удалось подключиться.';
exit;
//Выбрать нужную базу данных
$mysql = mysql_select_db( 'auth' );
echo ' Нужную базу данных не удалось выбрать.';
//Запрос к базе данных, чтобы проверить, существует ли соответствующая запись
$query = "select count(*) from auth where
name = '$name' and
pass = '$password'";
$result = mysql_query( $query );
if(!$result)
echo ' Запрос к базе данных не может быть осуществлен.';
$count = mysql_result( $result, 0, 0 );
if ( $count > 0 )
//Комбинация имени и пароля посетителя правильная
echo "<h1> Эта страница для зарегистрированных пользователей!</h1>";
echo " Мы рады тому, что Вы посетили нашу страничку.";
// Комбинация имени и пароля посетителя неправильная
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');
( 'testuser', password('test123') );
grant select, insert, update, delete
on auth.*
to webauth@localhost
identified by 'webauth';