АУТЕНТИФИКАЦИЯПОЛЬЗОВАТЕЛЕЙ
Лекция
ПодготовленаПрохоровым В.С.
Просьба к пользователюдоказать свою личность называется аутентификацией.
Обычный методаутентификации в 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«Доступ закрыт! При вводеданных была совершена ошибка. Для исправления ошибки нужно вернуться ahref=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», "")
orexit(«Соединение с MySQL-сервером не создано»);
//отправляем запростекущей активной БД на сервере и
//исоздаембазуданныхauth
$result=mysql_query(«createdatabase auth»);
if(!$result)echo«База данных не создана»;
//ВыбираемБДMySQL auth
$result=mysql_select_db(«auth»);
if(!$result)echo«База данных не выбрана»;
//отправляемMySQL-запрос/query и
//создаем таблицу authв базе данных auth
$result=mysql_query(«createtable auth
(
namevarchar(16) NOT NULL '',
passvarchar(16) NOT NULL '',
PRIMARY KEY(name)
)TYPE=MyISAM»);
if($result)echo "Таблицаauth создана";
//отправляем запростекущей активной БД на сервере и
//создаем списокпривилегий,
//которые могут бытьприменены ко всем таблицам базы данных auth
//пользователем adminс хоста localhost с паролем 12345
$result=mysql_query(«grantselect, insert, update, delete
on auth.*
toadmin@localhost identified by '12345';
»);
if($result) echo«Привилегии созданы»;
?>
Далее следует определитьпользователей, которым будет предоставлен доступ к защищенным ресурсам. Дляэтого нужно присвоить им login и pass. Создадим двух таких пользователей (оставим прежнего root и добавим нового testuser):
use auth;
insert intoauth values
('root','Z10N0101');
insert intoauth values
('testuser','test123');
Листингindex_1.html — страница с формой для улучшения механизма аутентификации из-за примененияMySQL.
АУТЕНТИФИКАЦИЯПОЛЬЗОВАТЕЛЯ MySQL
Пожалуйстазарегистрируйтесь
Зарегистрировавшись,Вы получите доступ к защищенной странице.
Имя и Парольможно получить у администратора.
Имя:
Пароль:
а1ue = Отправить>
Листинг secretdb.php— сценарий извлечения текста из полей формы и сравнение его с текстом из базыданных
if(!isset($_POST['login'])&&!isset($_POST['pass']))
{
//Посетитель долженввести имя и пароль
?>
АУТЕНТИФИКАЦИЯПОЛЬЗОВАТЕЛЯ MySQL
Пожалуйстазарегистрируйтесь
Зарегистрировавшись, Выполучите доступ к защищенной странице.
Имя и Пароль можно получитьу администратора.
Имя:
Пароль:
а1ue = Отправить>
}
else
{
//Подключиться к MySQL
$mysql=mysql_connect('localhost','root','');
if(!$mysql)
{
echo'К базе данных не удалосьподключиться.';
exit;
}
//Выбрать нужную базу данных
$mysql= mysql_select_db( 'auth' );
if(!$mysql)
{
echo'Нужную базу данных не удалосьвыбрать.';
exit;
}
//Запрос к базе данных для проверки, существуетли соответствующая запись
$query = «selectcount(*) 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 и двоихпользователей.
createdatabase auth;
use auth;
createtable auth (
namevarchar(10) not null,
passvarchar(30) not null,
primary key(name)
);
insert intoauth values
('user','pass');
insert intoauth values
('testuser', password('test123') );
grantselect, insert, update, delete
on auth.*
towebauth@localhost
identifiedby 'webauth';