Компьютеры
и программирование

Аутентификация пользователя

Будем учиться делать простую аутентификацию пользователей на сайте. На сайте могут быть страницы только для авторизованных пользователей и они будут полноценно функционировать, если добавить к ним наш блок аутентификации. Чтобы его создать, нужна база данных 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>

Аутентификация пользователей готова!

Поделиться с друзьями