Уроки PHP для начинающих


Админпанель для управления комментариями - защита

В нескольких видеороликах, которые можно скачать здесь, был предложен вариант админпанели для управления комментариями на сайте. Админпанель создавалась под скрипт для добавления комментариев, разработке которого посвящено несколько статей (начало здесь). В данной статье закроем доступ к админпанели всем, кому он по вполне понятной причине не нужен – то есть, всем, кто не админ сайта.

Для того чтобы вам был понятен материал этой статьи, нужно знать, что такое cookies и что такое сессии в php. Если вы этого пока не знаете, прочитайте сначала статьи Что такое Cookies? и Что такое сессии PHP и как они работают?. А уж после возвращайтесь сюда. С остальными продолжим.

Итак, в админке (папка adm) у нас сейчас следующие файлы:

- index.php (отвечает за просмотр всех комментариев, которые есть на сайте),

- edit_comm.php (отвечает за просмотр и редактирование комментариев),

- update_comm.php (скрипт-обработчик формы из файла edit_comm.php),

- del_comm.php (отвечает за удаление комментариев).

Задача: сделать вход в админпанель по паролю.

Начнём с того, что файл index.php переименуем в view_comm.php, а index.php создадим заново. Теперь в файле index.php пусто.

Подумаем, что должно происходить при обращении к файлу index.php.

При обращении, естественно, должна выводиться форма с полями для ввода логина и пароля и кнопкой. Затем, когда поля формы заполнены и кнопка нажата, должна быть проверка на правильность логина и пароля. Если пароль и/или логин не те, выводится соответствующее сообщение. Если же данные в форме верные, то происходит перенаправление на страницу view_comm.php.

Пишем в index.php следующий код:

<?php
if (!isset($_POST['login']) && !isset($_POST['pass'])) // если не существует логина и пароля, введённых в форму, то выводим форму и останавливаем скрипт; это будет происходить всегда при обращении к index.php или к папке, в которой файлы админки (вот так: http://phpcomm/adm/)
    {
        echo "<div align='center'><form action='' method='post'><p>Логин: <br/><input name='login' type='text'></p><p>Пароль: <br/><input name='pass' type='password'></p><p><input name='submit' type='submit' value='Войти'></p></form></div>";
        exit();
     }
 //иначе, то есть, если в полях формы что-то есть
// превращаем глобальные переменные в простые
if (isset($_POST['submit']))
{
      $login = $_POST['login'];
      $pass = $_POST['pass'];
//и проверяем, заполнены ли поля формы  
if (empty($login) or empty($pass))
   {
      echo"<p><font color='#ff0000'>Форма заполнена не полностью!</font></p>";
       exit;
   }
//подключаем файл, в котором хранятся логин и пароль
   include("setings.inc.php");
// проверяем, совпадают ли логин и пароль с логином и паролем админа
if (($login != $admlogin) || ($pass != $admpass))
//если логин и/или пароль не верные, выводим об этом сообщение
   {
      echo "<p><font color='#ff0000'>Пароль и/или логин указаны неверно!</font></p>";
   }
   //если же с логином и паролем всё в порядке, то переходим на страницу просмотра всех комментариев 
header ("Location: http://phpcomm/adm/view_comm.php");
}
?>

Казалось бы всё. Не совсем. Юмор в том, что защитили-то мы только index.php, в котором, собственно, и так ничего ценного нет. А вот прочие файлы админки как были доступны так и остались. Чтобы этого избежать и воспользуемся знаниями о куках и сессиях.

После проверки логина и пароля на правильность, в случае, когда эти данные верны, имя пользователя (админа) нужно запомнить в сессии, в cookies, и сессию запустить. Поэтому дополняем код:

<?php
if (!isset($_POST['login']) && !isset($_POST['pass'])) // если не существует логина и пароля, введённых в форму, то выводим форму и останавливаем скрипт; это будет происходить всегда при обращении к index.php или к папке, в которой файлы админки (вот так: http://phpcomm/adm/)
    {
        echo "<div align='center'><form action='' method='post'><p>Логин: <br/><input name='login' type='text'></p><p>Пароль: <br/><input name='pass' type='password'></p><p><input name='submit' type='submit' value='Войти'></p></form></div>";
        exit();
     }
  //иначе, то есть, если в полях формы что-то есть
// превращаем глобальные переменные в простые
if (isset($_POST['submit']))
{
      $login = $_POST['login'];
      $pass = $_POST['pass'];
  //и проверяем, заполнены ли поля формы  
if (empty($login) or empty($pass))
   {
      echo"<p><font color='#ff0000'>Форма заполнена не полностью!</font></p>";
       exit;
   }
  //подключаем файл, в котором хранятся логин и пароль
   include("setings.inc.php");
// проверяем, совпадают ли логин и пароль с логином и паролем админа
if (($login != $admlogin) || ($pass != $admpass))
//если логин и/или пароль не верные, выводим об этом сообщение
   {
      echo "<p><font color='#ff0000'>Пароль и/или логин указаны неверно!</font></p>";
   }
   //если же с логином и паролем всё в порядке, то
 // Запоминаем имя в сессии и создаём cookies с именем login и значением $login из поля формы; время существования cookies мы не указали, поэтому кука будет уничтожаться при закрытии браузера
    $_SESSION['login'] = $login;
     setcookie('login', $login);
      //запускаем сессию
   session_start();

//переходим на страницу просмотра всех комментариев 
header ("Location: http://phpcomm/adm/view_comm.php");
}
?>

Теперь, данные из переменной $_SESSION[‘login’] и из cookies должны обрабатываться и проверяться и остальными страницами админпанели, что и следует сделать. Открываем view_comm.php и в самый верх кода (в самый верх означает, что добавить новый код нужно перед всем прочим кодом) пишем:

<?php
// Если в контексте сессии не установлено имя пользователя, пытаемся взять его из cookies.
if (!isset($_SESSION['login']) && isset($_COOKIE['login']))
$_SESSION['login'] = $_COOKIE['login'];
// Еще раз ищем имя пользователя в контексте сессии.
$login = $_SESSION['login'];
// Неавторизованных пользователей отправляем на страницу регистрации.
if ($login == null)
{
    header("Location: index.php");
    exit();
}
?>

Этот же код добавляем в файлы edit_comm.php, updata_comm.php и del_comm.php.

Осталось добавить пару вещей: на страницы админки – ссылку «Выйти», а в коде index.php – удаление данных из сессии при обращении к этому файлу.

Начнём со ссылки «Выйти».

Проще всего добавить её через файл header.php, который в папке blocks. Тогда ссылка появится в «шапке» всех страниц админки. Ссылка ведёт на index.php:

<a href="index.php">Выйти</a>

Ну а как и в какое место «хэдэра» её поставить, вы и без меня отлично знаете, потому что HTML для вас - семечки.

Теперь возвращаемся к файлу index.php и дополняем:

<?php
if (!isset($_POST['login']) && !isset($_POST['pass'])) // если не существует логина и пароля, введённых в форму, то выводим форму и останавливаем скрипт; это будет происходить всегда при обращении к index.php или к папке, в которой файлы админки (вот так: http://phpcomm/adm/)
    {
        echo "<div align='center'><form action='' method='post'><p>Логин: <br/><input name='login' type='text'></p><p>Пароль: <br/><input name='pass' type='password'></p><p><input name='submit' type='submit' value='Войти'></p></form></div>";
// данные из сессии удаляются
unset($_SESSION['login']);

        exit();
     }
 //иначе, то есть, если в полях формы что-то есть
// превращаем глобальные переменные в простые
if (isset($_POST['submit']))
{
      $login = $_POST['login'];
      $pass = $_POST['pass'];
     //и проверяем, заполнены ли поля формы  
if (empty($login) or empty($pass))
   {
      echo"<p><font color='#ff0000'>Форма заполнена не полностью!</font></p>";
       exit;
   }
//подключаем файл, в котором хранятся логин и пароль
   include("setings.inc.php");
// проверяем, совпадают ли логин и пароль с логином и паролем админа
if (($login != $admlogin) || ($pass != $admpass))
//если логин и/или пароль не верные, выводим об этом сообщение
   {
      echo "<p><font color='#ff0000'>Пароль и/или логин указаны неверно!</font></p>";
   }
  //если же с логином и паролем всё в порядке, то
 // Запоминаем имя в сессии и создаём cookies с именем login и значением $login из поля формы; время существования cookies мы не указали, поэтому кука будет уничтожаться при закрытии браузера
    $_SESSION['login'] = $login;
     setcookie('login', $login);
   //запускаем сессию
   session_start();
//переходим на страницу просмотра всех комментариев 
header ("Location: http://phpcomm/adm/view_comm.php");
}
?>

Последняя мелочь – создаём файл setings.inc.php, в который помещаем логин и пароль админа:

<?php
$admlogin = "admin";
$admpass = "admin";
?> 

В код index.php можно добавить разные запреты на html-теги и на спецсимволы, ограничение на количество вводимых символов, обрезку лишних пробелов… в общем, всё, как делалось в самом скрипте для комментариев, - но это на ваше усмотрение.

Пароль и логин сделайте помудрёней. Будет также хорошо обозвать папку с админкой не adm, а тоже как-то позаковыристей (только сами не забудьте, как назвали... шутка!).

Прежде чем писать мне, что у вас ничего не работает, проверьте правильность путей к файлу-базе с комментариями и вообще всех путей: вполне естественно, что на вашем реальном сайте названия папок и файлов могут быть другими.

Всё. Успехов.

Автор: Андрей Чернобай

P. S. Подпишитесь на безплатную рассылку Вокруг Сайта и получайте на свой электронный адрес новые уроки по созданию сайта.

SmartResponder.ru
Ваше имя: *
Ваш e-mail: *

Оставьте свой отзыв о статье:



Введите цифровой код с картинки*:

осторожно, мошенник!

Эта информация поможет сохранить вам деньги >>>

Рассылки

"Вокруг Сайта"
подпишитесь и получайте на свой e-mail уроки, книги, статьи, скрипты, а также подарки и скидки на товары, продаваемые с сайта

SmartResponder.ru
Ваше имя: *
Ваш e-mail: *

"PHP-песочница"
- PHP для начинающих: уроки с подробным анализом скриптов, необходимых для вашего сайта:

PHP-песочница
Подписаться письмом

Скачать видео

Разделы Сайта




Карта
rss
Карта