Аутентификация пользователей                          
		Аутентификация пользователей                          
АУТЕНТИФИКАЦИЯ ПОЛЬЗОВАТЕЛЕЙ 
Лекция 
Подготовлена Прохоровым В.С. 
Просьба к пользователю доказать свою личность называется аутентификацией. 
Обычный метод аутентификации в Web -- это требование к посетителям предоставить уникальное имя пользователя и пароль. Аутентификация используется для разрешения или запрещения доступа к определенным страницам или ресурсам. Аутентификация может быть необязательной либо использоваться для других целей, например, для персонализации. 
1. Форма для передачи данных
Пользователь может в удобной форме ввести уникальное имя и пароль с помощью 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 из строки параметров. 
2. Трансляция полей формы
Независимо от того, каким методом -- 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; 
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 создана<br>";
//отправляем запрос текущей активной БД на сервере и
//создаем список привилегий, 
//которые могут быть применены ко всем таблицам базы данных 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.
<html>
<head>
<title>АУТЕНТИФИКАЦИЯ ПОЛЬЗОВАТЕЛЯ MySQL </title>
</head>
<body>
<h1>Пожалуйста зарегистрируйтесь</h1>
<p>Зарегистрировавшись, Вы получите доступ к защищенной странице.</p>
<p>Имя и Пароль можно получить у администратора.</p>
<form method=post action=secretdb.php>
Имя: <input type=text name=login> <br>
Пароль: <input type=password name=pass> <br>
<input type=submit vа1ue = Отправить><br>
</form>
</body>
</html>
Листинг secretdb.php -- сценарий извлечения текста из полей формы и сравнение его с текстом из базы данных
<?
if(!isset($_POST['login'])&&!isset($_POST['pass']))
{
//Посетитель должен ввести имя и пароль
?>
<html>
<head>
<title>АУТЕНТИФИКАЦИЯ ПОЛЬЗОВАТЕЛЯ MySQL </title>
</head>
<body>
<h1>Пожалуйста зарегистрируйтесь</h1>
<p>Зарегистрировавшись, Вы получите доступ к защищенной странице.</p>
<p>Имя и Пароль можно получить у администратора.</p>
<form method=post action=secretdb.php>
Имя: <input type=text name=login> <br>
Пароль: <input type=password name=pass> <br>
<input type=submit vа1ue = Отправить><br>
</form>
</body>
</html>
<?
}
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> 
<form method = post action = "secretdb.php"> 
<table border = 1> 
<tr> 
<th>Имя</th> 
<td> <input type = text name = name> </td> 
</tr> 
<tr> 
<th>Пароль</th> 
<td> <input type = password name = password> </td> 
</tr> 
<tr> 
<td colspan =2 align = center> 
<input type = submit value = "Вход"> 
</td> 
</tr> 
</table> 
</form> 
<? 
} 
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'; 
	
	
					
							 |