Реализуем авторизацию в админ панели

 

Доброго времени суток дорогой читатель Блога RS! Как я и обещал, сегодня последний пост из цикла статей "Разработка блога с нуля". Все следующие посты будут посвящены улучшению написанного нами проекта. В этом посте нам предстоит написать авторизацию для нашей админ панели. Какой файл мы будем паролить?

 

 

Как мне кажется, нам необходимо запаролить лишь один файл, а именно index.php, так как лишь в нем производится подключение к базе данных. Если вызвать, отдельно, кусочки кода, которые мы подключаем из папки moduls, ничего не произойдет, так как все они требуют подключения к БД. Так что, с помощью этих кусочков, нельзя навредить блогу! Значит паролить их вовсе не обязательно.

 

Цель

 

  • Вынесем скрипт подключения к БД в отдельный файл, и подключим его к index.php с помощью include
  • Создадим новую таблицу в БД где будем хранить логин и пароль администратора
  • Необходимо написать скрипт, который не даст нам зайти на главную страницу админки без авторизации, и перебросит нас на форму где администратору необходимо ввести логин и пароль
  • Необходимо создать новый php файл, и разместить в нем форму и код авторизации
  • Создадим шаблон формы
  • Напишем скрипт выхода администратора из админ панели, и разместим ссылку на этот скрипт на главной страницы админки

 

Выносим подключения к БД в отдельный файл

 

Так как мы будем использовать этот подключение к БД уже в двух файлах ( в index.php и login.php ) то будет разумнее вынести скрипт подключения в отдельный файл. Так же мы сейчас создадим в этом скрипте переменную в которой будем хранить адрес нашего блога ( в виде http://адрес_блога.ru ). Сначала вынесем скрипт, потом я объясню зачем нам нужна переменная с адресом.

<?php
$nameDB = "blog";//Название БД
$nameSERVER = "localhost";//Сервер
$nameUSER = "root";//Имя пользователя БД
$passUSER = "";//Пароль пользователя БД
mysql_select_db($nameDB, mysql_connect($nameSERVER,$nameUSER,$passUSER));


if(isset($_GET['server_root'])){$server_root = $_GET['server_root'];unset($server_root);}
if(isset($_POST['server_root'])){$server_root = $_POST['server_root'];unset($server_root);}

$server_root = "http://yoururl.ru/";
?>

Сохраните этот кусочек кода в отдельном файле ( я этот файл назвал db.php и поместил в папку с модулями ) После удалите этот скрипт из файла index.php и вместо него вставьте следующий код

//ПОДКЛЮЧЕНИЕ К БАЗЕ ДАННЫХ (БД)
include("moduls/db.php");
//ПОДКЛЮЧЕНИЕ К БАЗЕ ДАННЫХ (БД)

Теперь поясню три новых строчки в файле db.php. Строчки

if(isset($_GET['server_root'])){$server_root = $_GET['server_root'];unset($server_root);}
if(isset($_POST['server_root'])){$server_root = $_POST['server_root'];unset($server_root);}

позволят нам удалить переменную если ее кто-то попытается создать GET или POST запросом. Сама же переменная с адресом нужна нам для того, что бы определить, идет ли авторизация с нашего блога, а не с постороннего сервера. Такая защита может уберечь наш блог от взлома, ну если быть точнее, то помогает нам, администраторам и программистам, в это верить

 

Создадим новую таблицу в БД

 

Для начала хочу сказать следующее: в БД мы будем хранить зашифрованный пароль с помощью функции php md5(). Админский логин и пароль мы пропишем в ручную. Я поставлю следующие данные:

Логин: admin

Пароль: 123456

Зашифрованный пароль будет выглядеть так:

e10adc3949ba59abbe56e057f20f883e

То есть если пароль 123456 пропустить через функцию md5 то получится вот такой зашифрованный пароль.

Приступим. Заходим в phpMyAdmin и создаем новую таблицу:

Авторизация будет простенькой, поэтому трех полей нам достаточно. Заполняем поля:

И вставляем в ручную одну строчку в таблицу

 

Скрипт проверки авторизации

 

Сама авторизация представляет собой создание глобальной переменной $_SESSION. То есть если эта глобальная переменная есть, то пользователь авторизован, стало быть скрипт должен проверить, создана ли она ( глобальная переменная ). Если да то ничего не делать, если же нет, то перекинуть на файл login.php.

Перед тем как вызывать глобальную переменную $_SESSION, необходимо стартовать сессию, а именно прописать session_start(); Если этого не сделать, то глобальная переменная $_SESSION просто не будет работать!

В общем вот скрипт который необходимо вставить сразу после подключения к БД в index.php

//СКРИПТ ПРОВЕРКИ АВТОРИЗАЦИИ
if(isset($_GET['logSESS'])) {$logSESS = $_GET['logSESS'];unset($logSESS);}
if(isset($_POST['logSESS'])) {$logSESS = $_POST['logSESS'];unset($logSESS);}

session_start();
$logSESS = $_SESSION['$logSESS'];
if(!isset($logSESS))
{
header("location: login.php");
exit;
}
//СКРИПТ ПРОВЕРКИ АВТОРИЗАЦИИ

Так как значение глобальной переменной $_SESSION переносится в переменную $logSESS, то нам необходимо пресечь попытку создать эту переменную ( $logSESS ) иными способами ( я имею введу предотвратить создание этой переменной с помощью GET и POST запроса ). Именно эту функцию выполняют первые две строчки скрипта.

Далее мы стартуем сессию, и проверяем существует ли глобальная переменная $_SESSION. Если нет, то переносим пользователя на страницу авторизации.

 

Шаблон формы

 

Давайте для начала создадим шаблон. Шаблон представляет собой обычную форму с двумя текстовыми полями

<table width="600px" cellpadding="0" cellspacing="0" border="0" align="center">
<tr>
<td valign="top" align="center">
<form action="login.php" method="post" name="form">
<br>
<input style="width:150px;" name="loginDB" type="text" value="Логин">
<br>
<input style="width:150px;" name="passDB" type="password" value="Пароль">
<br><br><input type="submit" value="Авторизация">
</form>
</td>
</tr>
</table>

Тут нет ничего сложного. Мы не раз создавали подобные шаблоны. Назовем этот шаблон login.html и поместим в паку с шаблонами

 

Файл авторизации

 

Давайте для начала создадим функцию которая нам выдаст форму авторизации. Создаем новый файл, называем его login.php и помещаем его в папку admin

<?php
//ПОДКЛЮЧЕНИЕ К БАЗЕ ДАННЫХ (БД)
include("moduls/db.php");
//ПОДКЛЮЧЕНИЕ К БАЗЕ ДАННЫХ (БД)

//АВТОРИЗАЦИЯ
//место для кода авторизации
//АВТОРИЗАЦИЯ

//мета теги
$header_title = "Авторизация";
$header_metaD = "Авторизация";
$header_metaK = "Авторизация";
//мета теги

function form_author()//функция подключения формы
{
$sm_read = file("templates/login.html");//...подключаем шаблон
$sm_read = implode("",$sm_read);//функция file() возвращаем массив, поэтому склеиваем его

return $sm_read;//выводим результат
}

$txt = form_author();//вызываем функцию подключения формы

include("templates/index.html");//главный шаблон
?>

В этом файле мы подключаемся к БД ( в самом вверху ). Далее я оставил место для скрипта авторизации ( что бы было проще объяснить куда вставить скрипт который я выложу ниже ) После мы объявляем мета теги, и создаем нашу функцию.

Функция сама по себе очень не сложная, тут производится подключение шаблона, и не более того. Предпоследняя строчка сохраняет результат функции в переменную $txt. Ну и последняя строчка подключает главный шаблон.

Сейчас если вы попытаетесь проникнуть в админскую панель блога, но Вас перекинет на вот такую страницу

Теперь я Вам выложу сам скрипт авторизации ( в коде имеет комментарий почти каждая строчка ), и немного прокомментирую его ниже

//АВТОРИЗАЦИЯ
//уничтожаем переменную с логином и паролем которые были созданы путем ввода их в строку
if (isset ($_GET['loginDB'])) {$loginDB = $_GET['loginDB'];unset($loginDB);}
if (isset ($_GET['passDB'])) {$passDB = $_GET['passDB'];unset($passDB);}

//заносим в отдельные переменные логин и пароль присланных с помощью post запроса
if (isset ($_POST['loginDB'])) {$loginDB = $_POST['loginDB'];}
if (isset ($_POST['passDB'])) {$passDB = $_POST['passDB'];}

if(isset($loginDB) AND isset($passDB))//если существуют логин и пароль
{
if(preg_match("/^[a-zA-Z0-9_-]+$/s",$loginDB) AND preg_match("/^[a-zA-Z0-9]+$/s",$passDB))//проверяем их на корректность ввода с помощью регулярных выражений
{
$prov = getenv('HTTP_REFERER');//определяем страницу с который пришел запрос
$prov = str_replace("www.","",$prov);//удаляем www если есть
preg_match("/(http\:\/\/[-a-z0-9_.]+\/)/",$prov,$prov_pm);//чистим адресс от лишнего, нам необходимо добиться ссылки вот такого вида http://xxxx.ru
$prov = $prov_pm[1];//заносим чистый адрес в отдельную переменную
$server_root = str_replace("www.","",$server_root);//удаляем www если есть

if($server_root == $prov)//если адрес нашего блога и адрес страницы с которой был прислан зарос равны
{
$passDB = md5($passDB);//шифруем введенный пароль

$resultlp = mysql_query("SELECT login,pass FROM user WHERE login='$loginDB'");//выводим из базы данных логин и пароль
$log_and_pass = mysql_fetch_array($resultlp);

if($log_and_pass != "")//если был выведен результат из БД
{
if($loginDB == $log_and_pass[login] AND $passDB == $log_and_pass[pass])//если введенная информация совпадает с информацией из БД
{
session_start();//стартуем сессию
$_SESSION['$logSESS'] = $log_and_pass[login];//создаем глобальную переменную
header("location: index.php");//переносим пользователя на главную страницу
exit;
}
else//если введеная инфо не совпадает с инфо из БД
{
header("location: login.php");//переносим на форму авторизации
exit;
}
}
else//если не найдено такого юзера в БД
{
header("location: login.php");//переносим на форму авторизации
exit;
}
}
else//если запрос был послан с другого адреса
{
header("location: login.php");//переносим на форму авторизации
exit;
}
}
else//если введены не корректный логин и пароль
{
header("location: login.php");//переносим на форму авторизации
exit;
}
}
//АВТОРИЗАЦИЯ

Этот кусочек кода вставляется в файле login.php вместо вот этих строк

//АВТОРИЗАЦИЯ
//место для кода авторизации
//АВТОРИЗАЦИЯ

Как работает скрипт? Для начала уничтожает переменные, с логином и паролем, созданные методом GET ( если такие имеются ). После идет проверка на корректность логина и пароля с помощью регулярных выражений.

Так же производится формирование адреса с которого пришел пользователь. То есть адрес, с которого пришел пользователь, должен быть таким:

http://yoururl.ru/login.php

а после формирование, вот таким:

http://yoururl.ru/

Этот адрес сравнивается с адресом из переменной $server_root которую мы объявили в подключение к БД ( файл db.php )

Далее идут проверки на совпадения введенного пароля и пароля из БД. Только после этих проверок создается глобальная переменная, и пользователь перенаправляется на главную страницу админ панели.

Если же хотя бы одно условие не сработает, то пользователя перенаправят обратно к форме.

Теперь если ввести в окно формы

логин - admin

пароль - 123456

То Вас перенесет в админ панель. Если же вы введете неправильный логин или пароль, Вас перекинет обратно к форме.

 

Кнопка "Выход"

 

Сейчас нам придется править главный шаблон админ панели, мы вставим в него ссылку на скрипт выхода, поэтому мы еще заодно пропишем в шаблон ссылку на главную страницу админ панели. Добьемся того, что бы при щелчке по логотипу в админ панели, нас переносило на главную страницу. ( Это конечно не обязательно )

Вот новый кусочек кода который я вставил, вместо старого, в шаблон index.html

        <!--ЛОГО-->
<div class="logo">
<div class="logoP">
<p style="padding:3px;"><a style="font-weight:100;" href="/index.php">Добро пожаловать в админ панель</a> <a href="exit.php" style="font-size:10px;font-weight:100;">(Выход)</a></p>
</div>
</div>
<!--ЛОГО-->

Теперь создадим новый файл, назовем его exit.php и поместим его в папку admin. Вот код файла

<?php
session_start();//стартуем сессию
unset ($_SESSION['$logSESS']);//удаляем зарегистрированную глобальную переменную
session_destroy();//уничтожаем сессию
header("location: ../");//перебрасываем на главную страницу пользовательской части блога
exit;
?>

Тут каждая строчка имеет комментарий, так, что разберетесь

 

Заключение

 

Ну чтож, на этом я заканчиваю разработку простейшей CMS на php. Если это первый пост который Вы читаете на этом блоге, то вот список всех статей посвященные разработки блога с нуля. Совсем скоро открою рубрику "Улучшения" и продолжу мучить наш проект Так что подпишитесь на новости, и ждите новые посты!

Если у Вас возникли какие либо вопросы, то не стесняйтесь, задавайте их, буду рад ответить ( если конечно в силах ответить на Ваш вопрос ).

Удачи Вам, на сегодня у меня все!

Исходник

Возможно Вам будут интересны следующие заметки