Аутентификация пользователя
Будем учиться делать простую аутентификацию пользователей на сайте. На сайте могут быть
страницы только для авторизованных пользователей и они будут полноценно функционировать,
если добавить к ним наш блок аутентификации. Чтобы его создать, нужна база данных MySQL.
Она может иметь 5 колонок (минимум), а может и больше, если вы хотите добавить информацию
о пользователях. Назовём базу данных “Userauth”.
Создадим в ней следующие поля: ID для
подсчёта числа пользователей, UID для уникального идентификационного номера пользователя,
Username для имени пользователя, Email для адреса его электронной почты и Password для
пароля. Вы можете использовать для авторизации пользователя и уже имеющуюся у Вас базу
данных, только, как и в случае с новой базой данных, создайте в ней следующую таблицу.
Код MySQL
CREATE TABLE `users` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`UID` int(11) NOT NULL,
`Username` text NOT NULL,
`Email` text NOT NULL,
`Password` text NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Теперь создадим файл "sql.php". Он отвечает за подключение к базе данных. Данный код,
во первых, создаёт переменные для сервера и пользователя, когда он подключается к серверу.
Во-вторых, он выберет базу данных, в данном случае "USERAUTH". Этот файл нужно подключить
в "log.php" и "reg.php" для доступа к базе данных.
Код PHP
<?php
//sql.php
$server = "localhost"; //Ваш сервер MySQL
$user = "root"; //Ваше имя пользователя MySQL
$pass = "redere"; //пароль
$conn = mysql_connect($server, $user, $pass);//соединение с сервером
$db = mysql_select_db("userauth", $conn);//выбор базы данных
if(!$db) { //если не может выбрать базу данных
echo "Извините, ошибка :(/>";//Показывает сообщение об ошибке
exit(); //Позволяет работать остальным скриптам PHP
}
?>
Далее страница входа, пусть она называется "login.php". Во-первых, она проверяет введённые
данные на наличие ошибок. Страница имеет поля для имени пользователя, пароля, кнопку
отправки и ссылку для регистрации. Когда пользователь нажмёт кнопку «Вход», форма будет
обработана кодом из файла "log.php", а затем произойдёт вход в систему.
Код PHP
<?php
//login.php
session_start(); //начало сессии
if(isset($_SESSION['ERRMSG']) &&is_array($_SESSION['ERRMSG']) &&count($_SESSION['ERRMSG']) >0 ) { //если есть ошибки сессии
$err = "<table>"; //Start a table
foreach($_SESSION['ERRMSG'] as $msg) {//распознавание каждой ошибки
$err .= "<tr><td>" . $msg . "</td></tr>"; //запись её в переменную
}
$err .= "</table>"; //закрытие таблицы
unset($_SESSION['ERRMSG']); //удаление сессии
}
?>
<html>
<head>
<title>Форма входа</title>
</head>
<body>
<form action='log.php' method='post'>
<table align="center">
<tr>
<td><?php echo $err; ?></td>
</tr>
<tr>
<td>Имя пользователя</td>
<td><input type='text' name='username'></td>
</tr>
<tr>
<td>Пароль</td>
<td><input type='password'name='password'></td>
</tr>
<tr>
<td><input type='submit'value='Войти'></td>
<td><a href="register.php">Регистрация</a></td>
</tr>
</table>
</form>
</body>
</html>
Затем пишем скрипт для входа в систему. Назовём его "log.php". Он имеет функцию для
очистки входных данных от SQL-инъекций, которые могут испортить ваш скрипт. Во-вторых,
он получает данные формы и проверяет их на правильность. Если входные данные правильны,
скрипт отправляет пользователя на страницу авторизованных пользователей, если нет –
устанавливает ошибки и отправляет пользователя на страницу входа.
Код PHP
<?php
include("sql.php"); //соединение с SQL
session_start(); //начало сессии для записи
function Fix($str) { //очистка полей
$str = trim($str);
if(get_magic_quotes_gpc()) {
$str = stripslashes($str);
}
return mysql_real_escape_string($str);
}
$errmsg = array(); //массив для сохранения ошибок
$errflag = false; //флаг ошибки
$username = Fix($_POST['username']);//имя пользователя
$password = Fix($_POST['password']);//пароль
//проверка имени пользователя
if($username == '') {
$errmsg[] = 'Username missing'; //ошибка
$errflag = true; //поднимает флаг в случае ошибки
}
//проверка пароля
if($password == '') {
$errmsg[] = 'Password missing'; //ошибка
$errflag = true; //поднимает флаг в случае ошибки
}
//если флаг ошибки поднят, направляет обратно к форме регистрации
if($errflag) {
$_SESSION['ERRMSG'] = $errmsg; //записывает ошибки
session_write_close(); //закрытие сессии
header("location: login.php"); //перенаправление
exit();
}
//запрос к базе данных
$qry = "SELECT * FROM `users` WHERE `Username` = '$username' AND `Password` = '" . md5($password) . "'";
$result = mysql_query($qry);
//проверка, был ли запрос успешным (есть ли данные по нему)
if(mysql_num_rows($result) == 1) {
while($row = mysql_fetch_assoc($result)) {
$_SESSION['UID'] = $row['UID'];//получение UID из базы данных и помещение его в сессию
$_SESSION['USERNAME'] = $username;//устанавливает, совпадает ли имя пользователя с сессионным
session_write_close(); //закрытие сессии
header("location: member.php");//перенаправление
}
} else {
$_SESSION['ERRMSG'] = "Invalid username or password"; //ошибка
session_write_close(); //закрытие сессии
header("location: login.php"); //перенаправление
exit();
}
?>
Сделаем страницу регистрации, назовём её "register.php". Она похожа на страницу входа,
только имеет на несколько полей больше, а вместо ссылки на регистрацию – ссылку на
login.php на случай, если у пользователя уже есть аккаунт.
Код PHP
<?php
//register.php
session_start(); //начало сессии
if(isset($_SESSION['ERRMSG']) &&is_array($_SESSION['ERRMSG']) &&count($_SESSION['ERRMSG']) >0 ) { //если есть ошибки сессии
$err = "<table>"; //начало таблицы
foreach($_SESSION['ERRMSG'] as $msg) {//устанавливает каждую ошибку
$err .= "<tr><td>" . $msg . "</td></tr>"; //записывает их в переменную
}
$err .= "</table>"; //конец таблицы
unset($_SESSION['ERRMSG']); //уничтожает сессию
}
?>
<html>
<head>
<title>Форма регистрации</title>
</head>
<body>
<form action='reg.php' method='post'>
<table align="center">
<tr>
<td><?php echo $err; ?></td>
</tr>
<tr>
<td>Имя пользователя</td>
<td><input type='text' name='username'></td>
</tr>
<tr>
<td>E-mail</td>
<td><input type='text' name='email'></td>
</tr>
<tr>
<td>Пароль</td>
<td><input type='password' name='password'></td>
</tr>
<tr>
<td>Повтор пароля</td>
<td><input type='password' name='rpassword'></td>
</tr>
<tr>
<td><input type='submit' value='Зарегистрировать'></td>
<td><a href="login.php">У меня есть аккаунт</a></td>
</tr>
</table>
</form>
</body>
</html>
Теперь сделаем скрипт регистрации в файле "reg.php". В него будет включён "sql.php" для
подключения к к базе данных. Используется и та же функция, что и в скрипте входа для
очистки поля ввода. Устанавливаются переменные для возможных ошибок. Далее – функция для
создания уникального идентификатора, который никогда ранее не предоставлялся. Затем
извлекаются данные из формы регистрации и проверяются. Происходит проверка, что адрес
электронной почты указан в нужном формате, а также, правильно ли повторно указан пароль.
Затем скрипт проверяет, нет ли в базе данных пользователя с таким же именем, и, если есть,
сообщает об ошибке. И, наконец, код добавляет пользователя в базу данных.
Код PHP
<?php
//reg.php
include("sql.php"); //соединение с SQL
session_start(); //начало сессии для записи
function Fix($str) { //очистка полей
$str = @trim($str);
if(get_magic_quotes_gpc()) {
$str = stripslashes($str);
}
return mysql_real_escape_string($str);
}
$errmsg = array(); //массив для хранения ошибок
$errflag = false; //флаг ошибки
$UID = "12323543534523453451465685454";//уникальный ID
$username = Fix($_POST['username']);//имя пользователя
$email = $_POST['email']; //Email
$password = Fix($_POST['password']);//пароль
$rpassword = Fix($_POST['rpassword']);//повтор пароля
//проверка имени пользователя
if($username == '') {
$errmsg[] = 'Username missing'; //ошибка
$errflag = true; //поднимает флаг в случае ошибки
}
//проверка Email
if(!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email)) { //должен соответствовать формату: me@hi.com
$errmsg[] = 'Invalid Email'; //ошибка
$errflag = true; //поднимает флаг в случае ошибки
}
//проверка пароля
if($password == '') {
$errmsg[] = 'Password missing'; //ошибка
$errflag = true; //поднимает флаг в случае ошибки
}
//проверка повтора пароля
if($rpassword == '') {
$errmsg[] = 'Repeated password missing';//ошибка
$errflag = true; //поднимает флаг в случае ошибки
}
//проверка валидности пароля
if(strcmp($password, $rpassword) != 0 ) {
$errmsg[] = 'Passwords do not match';//ошибка
$errflag = true; //поднимает флаг в случае ошибки
}
//проверка, свободно ли имя пользователя
if($username != '') {
$qry = "SELECT * FROM `users` WHERE `Username` = '$username'"; //запрос к MySQL
$result = mysql_query($qry);
if($result) {
if(mysql_num_rows($result) > 0) {//если имя уже используется
$errmsg[] = 'Username already in use'; //сообщение об ошибке
$errflag = true; //поднимает флаг в случае ошибки
}
mysql_free_result($result);
}
}
//если данные не прошли валидацию, направляет обратно к форме регистрации
if($errflag) {
$_SESSION['ERRMSG'] = $errmsg; //сообщение об ошибке
session_write_close(); //закрытие сессии
header("location: register.php");//перенаправление
exit();
}
//добавление данных в базу
$qry = "INSERT INTO `userauth`.`users`(`UID`, `Username`, `Email`, `Password`) VALUES('$UID','$username','$email','" . md5($password) . "')";
$result = mysql_query($qry);
//проверка, был ли успешным запрос на добавление
if($result) {
echo "Благодарим Вас за регистрацию, " .$username . ". Пожалуйста, входите <a href=\"login.php\">сюда</a>";
exit();
} else {
die("Ошибка, обратитесь позже");
}
?>
Ещё нужно сделать скрипт для выхода пользователя из системы. Он прекращает сессию для
пользователя с данным уникальным идентификатором и именем, а затем перенаправляет
пользователя на страницу входа в систему.
Код PHP
<?php
session_start();
unset($_SESSION['UID']);
unset($_SESSION['USERNAME']);
header("location: login.php");
?>
И, наконец, скрипт "auth.php" можно использовать, чтобы сделать страницы доступными
только для авторизованных пользователей. Он проверяет данные входа и, если они верны,
позволяет пользователю просматривать страницы, а если нет, просит авторизоваться. Кроме
того, если кто-то попытается взломать сайт создав одну из сессий, она будет прервана, как
в общем случае.
Код PHP
<?php
include("sql.php");
session_start();
function Destroy() {
unset($_SESSION['UID']);
unset($_SESSION['USERNAME']);
header("location: login.php");
}
if(isset($_SESSION['UID']) && isset($_SESSION['USERNAME'])) {
$UID = $_SESSION['UID'];
$username = $_SESSION['USERNAME'];
$qry = mysql_query("SELECT * FROM `users` WHERE `UID` = '$UID' AND `Username` = '$username'");
if(mysql_num_rows($qry) != 1) { Destroy(); }
} else { Destroy(); }
?>
Одно из условий в коде выше является предметом вопроса в
Тесте по теме Программирование PHP/MySQL.
Следующий код нужно вставить на страницу для авторизованных пользователей, она называется,
например, "member.php", а у Вас может называться как угодно.
Код PHP
<?php include("auth.php"); ?>
Вам разрешён доступ к этой странице. <a href="logout.php">Выйти (<?php echo $_SESSION['USERNAME']; ?>)</a>
Аутентификация пользователей готова!
Поделиться с друзьями