РНР программирование

 

                        Главная         Программа телепередач, энциклопедии и многие другие справочные материалы

 

 

 

1.2. Программа регистрации и авторизации на сайте с шифрованием пароля

            В PHP есть функция md5(), которая позволяет зашифровать ваш пароль (пароль вводимый пользователем) и в зашифрованном виде мы запишем его в базу данных. А сейчас нам надо описать алгоритм регистрации и авторизации на сайте, включая шифрование пароля по алгоритму  MD5.

            Начнем с того, что создадим нормальную форму html для авторизации и регистрации на сайте. Если у вас есть предпочтение к каким-либо редакторам файлов html – возражений нет, но мы рекомендуем использовать MS FrontPage. Он прост и удобен для быстрого создания html страниц.  Вот так будет выглядеть html страница с формой авторизации и регистрации.

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

<title>Только для зарегистрированных по</title>

</head>

<body>

<table border="2" cellpadding="0" cellspacing="0" width="1215" height="376" bordercolor="#000080" bgcolor="#FFFFFF">

                        <tr>

                        <td valign="top" colspan="2" height="45">

                        <p align="center"><font color="#800000"size="5">

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

Демонстрационный сайт</font></td>

            </tr><tr><td msopnltype="NavBody" rowspan="2" width="208">

 <p align='center'>Только для зарегистрированных пользователей!</p>

 <p align='center'>Вам нужно авторизоваться или

 <a href='registration.htm'>зарегистрироваться</a>, это не займёт у Вас много времени.</p>

 <center>

 <form action='avtoriz.php' method='post'>

 <table border='0'>

 <tr>

 <td>Логин</td>

   <td><input type='text' size='20' name='name' /></td>

 </tr>

 <tr>

 <td>Пароль</td>

   <td><input type='password' size='20' name='parol' /></td>

 </tr>

 </table>

 <input type='submit' name='submit' value='Авторизоваться' style="font-weight: bold">

 <p><a href='av_email.htm'>Забыли пароль?</a> </p>

 </form>&nbsp;</td>

                        <td valign="top" height="293">

                        <!-- MSCellType="ContentBody" -->

                        <p align="center">&nbsp;</p>

                        <p align="center">

                        <font size="5" color="#FF00FF">Программы кабельного телевидения</font></p>

                        <p align="center"><font size="5" color="#FF00FF">Сайт любительского рисунка</a></font><p align="center">

                        <font size="5" color="#FF00FF">Аквариумные рыбки и растения</font></td>

            </tr><tr><td valign="top" height="34" width="999">&nbsp;</td>

            </tr>

</table>

</body> </html>

Попробуйте открыть эту страницу в браузере, что бы посмотреть как она выглядит.

А сейчас несколько слов об алгоритме  регистрации и авторизации. Для того, что бы идентифицировать пользователя достаточно его имени. Но имена могут (и наверняка будут) повторятся среди пользователей. Поэтому, что бы однозначно идентифицировать пользователя в базе данных, введем его email, который является уникальным атрибутом пользователя (т.к. электронная почта не позволяет совпадение электронных адресов).  Фактически этого достаточно для того что бы однозначно идентифицировать пользователя. Для чего тогда нужен пароль? Что бы защититься от "злоумышленников". Имя пользователя и адрес электронный почты можно легко подобрать с помощью несложных программ (или их может подсмотреть администратор системы) и тогда ваши данные могут быть доступны всей общественности. А этого допускать не надо. Тогда для защиты потребуется  ввести ваш личный пароль, который будете знать только Вы, и даже администратор системы не сможет его подсмотреть, так как пароль в базе данных будет зашифрован. Понятно, что чем сложнее пароль, тем труднее его подобрать. Конечно, не надо использовать такие пароли, как "123" или "password" или "1" , которые невольно приходят в голову, когда лень шевелить мозгами. После ввода пароля ваши данные будут защищены сильнее, но не достаточно. Когда при регистрации Вы вводите пароль, каждый символ заменяется звездочкой (для защиты от посторонних глаз), и что бы быть уверенным, что вы ввели то, что хотели, необходимо повторить ввод пароля. Программа сравнит эти данные и если вы не ошиблись, зарегистрирует ваш пароль. Почему данные защищены не достаточно? Во-первых, вы можете забыть пароль (поверьте, это бывает часто) и тогда вы сами не сможете иметь доступ к своим данным. Как быть? Для этого можно переустановить пароль по имени пользователя и email, однако, этим способом могут воспользоваться "хитрые пользователи", что бы переустановить ваш пароль и воспользоваться им. Тогда мы введем еще один пароль, который будет вводиться, как строка текста - ответ на вопрос "Ваше любимое блюдо". Вы будете видеть ввод этого текста  и его так же надо запомнить, как и пароль. В этом случае для восстановления забытого пароля вам необходимо будет ввести ваше имя, email и ваше любимое блюдо и если эти данные окажутся верными, вам представится возможность ввести новый пароль. Таким образом, пользовательские данные в вашей базе данных будут защищены более надежно. 

Ниже приведена программа "avtoriz.php", которая является обработчиком формы приведенной выше html страницы  - файл  "Index.htm".

Ниже приведена программа "avtoriz.php",

<?php

global $n, $name, $dater, $tbname;

// продолжаем расширять использование возможностей php, а именно, напишем свою функцию

// подключения к таблице базы данных после авторизации пользователя пользователя

function on_tbn($n)

 {

// имя таблицы будет состоять из "XXX_" плюс его номер в таблице userslist

// номер в таблице является уникальным так же как и имя пользователя

   $nametb = "XXX_".$n;

   echo "<p>Имя таблицы = $nametb </p>";

   $query = "SELECT * FROM $nametb";

   $result = mysql_query($query);

   if(!$result) exit("Ошибка 1 - ".mysql_error());

   else echo "<p>Запрос выполнен!</p>";

  // Так как запрос может возвращать несколько строк, применяем цикл

  echo "<table border=2>";

  while(list($n, $dater, $name, $email, $p1,$p2,$p3,$p4) = mysql_fetch_row($result))

  {

    echo "<tr>

            <td>Ваш рег.номер: $n</td>

            <td>дата регистрации: $dater</td>

            <td>Ваше имя: $name</td>

            <td>Электронный адрес: $email</td>

          </tr>";

  }

  echo "</table>"; 

 } // закончили функцию содания таблицы пользователя

  /////////////////////////////////////////////////

function in_data($n)

{

echo "

<form action='{$_SERVER['PHP_SELF']}' method='post'>

<table border='0'>

<input type='submit' name='submit' value='Начинаем работу'>

</form></table>"; 

}

// в файле index.htm находится форма для авторизации на сайте

// если вы уже зарегистрированы (ввели свое имя, электронный адрес email, пароль и "свое любимое блюдо",

// то для захода на сайт вам необходимо ввести только имя и пароль

 

// 1. Блок проверки правильности ввода данных

// Удаляем лишние пробелы. Здесь мы работаем с глобальным массивом $_POST[], хотя можно было

// ввести непосредсвенно php-переменные  $name, $parol и т.д., что мы и сделаем

  $name = trim($_POST['name']); $parol = trim($_POST['parol']);

// php позволяет записывать несколько операторов в одну строку  

// Проверяем, правильно ли заполнены обязательные поля, если нет то выходим из прогрраммы - функция exit()

  if(empty($name)) exit('Поле "Имя" не заполнено');

  if(empty($parol)) exit ('Поле "Пароль" не заполнено');

// Если на сервере не включены "магические кавычки",

// обрабатываем введенные пользователями данные

// функцией mysql_escape_string() - это наверняка не пригодится

  if (!get_magic_quotes_gpc())

  {

    echo "<p> ку-ку, мы здесь были</p>";

    $name  = mysql_escape_string($name);

    $parol  = mysql_escape_string($parol);

  }

// Устанавливаем соединение с базой данных

// require_once("Connect_BD.php"); можно так, а можно и через include - разницы почти никакой

  include "Connect_BD.php";   // загружаем файл для подключению к серверу MySQL

// и соединения с базой данных Mydata 

// Проверяем, есть ли переданное имя в базе данных

  $query = "SELECT * FROM userslist WHERE name = '$name'"; // сформировали запрос для MySql

  $result = mysql_query($query);    // выполнили запрос

  echo "<p> result = $result</p>";  // отладочная печать - интересно посмотреть что там

  $num = mysql_num_rows($result);   // получим количество найденных записей

// в принципе имена не повторяются, но вдруг ...

  echo "<p>$num записи(ей) найдено!</p>";

  $i=0;

 while($i < $num) // цикл while выполняются операторы в скобках, пока условие выполняется

    {

      $parol_bd= mysql_result($result,$i, 'userslist.parol');  // получили пароль из базы данных

      $n = mysql_result($result,$i, 'userslist.n');

      $i++;

    }

  echo "<p>$n - номер пользователя!</p>";

 // далее анализ на попадание  

  if($num == 0) exit("Имя '$name' в базе данных не зарегистрировано!");  

// прерываем работу скрипта,так как имя не найдено

// в противном случае  продолжаем работу

  else   {  echo "<p>3. Данное имя '$name' зарегистрировано. ОК!</p>";  }

// сравним введенный пароль с паролем в базе данных

$parol = md5($parol); // введенный пароль преобразуем по md5(), что бы сравнить с паролем в БД

// echo "Пароль введенный = $parol ,  Пароль в БД = $parol_bd "; // посмотрим на пароли

// Сравним пароли - можно так

   if ($parol == $parol_bd)

     { echo "<p> $name, добро пожаловать на сайт!";

       on_tbn($n); // вызываем функцию on_tbn() для подключения к таблице БД

       in_data($n); // эта функция будет вводить данные в таблицу БД

      }

   else echo "<p>Пароль не верен, повторите ввод пароля!</p>";

//а можно и таким образом

//  if (!strcmp($parol, $parol_bd)) echo "<p> $name, добро пожаловать на сайт!";   

// Новые функции с которыми мы встретились: 

// функция strcmp($parol, $parol_bd)) сравнивает две строки на совпадение, если строки совпадает функция возвращает 0 

?>

А вот так будет выглядеть html страница для регистрации пользователя.

Файл registration.htm

 

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

<title>Форма для регистрации в базе данных</title>

</head>

<body>

<p align='center'><font size="5">Форма для регистрации в базе данных</font></p>

 <center>

 <form action='registr.php' method='post'>

 <table border='0'>

 <tr>

 <td>Имя (<font color="#FF0000">*</font>)</td>

   <td><input type='text' size='20' name='name' /></td>

 </tr>

 <tr>

 <td>Пароль (<font color="#FF0000">*</font>)</td>

   <td><input type='password' size='20' name='parol' /></td>

 <td>Подтверждение пароля (<font color="#FF0000">*</font>)</td>

    <td><input type='password' size='20' name='parol_again' /></td>

  </tr>

 <tr>

 <td>Электронный адрес (<font color="#FF0000">*</font>)</td>

    <td><input type='text' size='20' name='email' /></td>

  </tr>

 <tr>

 <td>Сайт (<font color="#FF0000">*</font>)</td>

    <td><input type='text'  name='url' /></td>

 </tr>

 <tr>

 <td>Ваше любимое блюдо :</td>

    <td><input type='text'  name='bludo' /></td>

 </tr>

 </tr>

 </table>

 <input type='submit' name='submit' value='Регистрация' style="font-weight: bold; color: #008000">

 </center>

 </form>

 </body>

</html>

Программа обработки этой формы "registr.php" выглядит так:

<?php

Global $dater, $name;

// продолжаем расширять использование возможностей php, а именно, напишим свою функцию

// создания таблицы базы данных для зарегистрированного пользователя

function create_tab($n,$name, $email)

 {

// имя таблицы будет состоять из "XXX_" плюс его номер в таблице userslist

// номер в таблице является уникальным, так же как и имя пользователя

   $nametb = "XXX_".$n;

   echo "<p>Имя таблицы = $nametb </p>";

   $query = "CREATE TABLE $nametb (

             `n` INT NOT NULL ,

             `dater` TEXT NOT NULL ,

             `name` TEXT NOT NULL ,

             `email` TEXT NOT NULL ,

             `p1` TEXT NOT NULL ,

             `p2` TEXT NOT NULL ,

             `p3` TEXT NOT NULL ,

             `p4` TEXT NOT NULL )";

   $result = mysql_query($query);

   if(!$result) exit("Ошибка 1 - ".mysql_error());

   else echo "<p>Таблица $nametb создана</p>";

   $dater = date("m.d.Y");

   echo "<p>Дата = $dater</p>";

// пропишем в первую строку базы данных учетную информацию, которую буду выводить на страницу пользователя

    $query = "INSERT INTO $nametb ( `n` , `dater`, `name` , `email`,`p1` , `p2` ,`p3`, `p4`)

              VALUES ('$n', '$dater', '$name', '$email', '1', '2', '3', '4')";

   $result = mysql_query($query);

   if(!$result) exit("Ошибка 1 - ".mysql_error());

   else echo "<p>Данные добавлены </p>";

 

 } // закончили функцию содания таблицы пользователя

  /////////////////////////////////////////////////

 

// в файле registration.htm находится форма для регистрации  на сайте

// если вы не зарегистрированы сделайте это: введите свое имя, электронный адрес email,

// пароль и "Ваше любимое блюдо"

// "Ваше любимое блюдо"- это фактически открытый пароль на русском языке нужен

// в том случае если вы забыли основной пароль

 

 

 

  /////////////////////////////////////////////////

  // 1. Блок проверки правильности ввода данных

  // Удаляем лишние пробелы. Здесь мы работаем с глобальным массивом $_POST[], хотя можно было

  // ввести непосредсвенно php-переменные  $name, $parol и т.д.

  $_POST['name'] = trim($_POST['name']);

  $_POST['parol'] = trim($_POST['parol']);

  $_POST['parol_again'] = trim($_POST['parol_again']);

  // Проверяем, не пуст ли суперглобальный массив $_POST

  if(empty($_POST['name'])) {echo "пуст суперглобальный массив"; exit();}

  // Проверяем, правильно ли заполнены обязательные поля

  if(empty($_POST['name'])) exit('Поле "Имя" не заполнено');

  if(empty($_POST['parol'])) echo 'первое из полей "Пароль" не заполнено';

  if(empty($_POST['parol_again'])) exit('Второе из полей "Пароль" не заполнено');

  if($_POST['parol'] != $_POST['parol_again']) exit('Пароли не совпадают');

  // Если введен e-mail, проверяем его на соответствие

  if(!empty($_POST['email']))

  {

    if(!preg_match("|^[-0-9a-z_]+@[-0-9a-z_]+\.[a-z]{2,6}$|i",

                   $_POST['email']))

    {

      exit('Поле "E-mail" должно соответствовать формату

            somebody@somewhere.ru');

    }

  }

  // Если на сервере не включены "магические кавычки",

  // обрабатываем введенные пользователями данные

  // функцией mysql_escape_string()

  if (!get_magic_quotes_gpc())

  {

    $_POST['name']  = mysql_escape_string($_POST['name']);

    $_POST['parol']  = mysql_escape_string($_POST['parol']);

    $_POST['email'] = mysql_escape_string($_POST['email']);

    $_POST['url']  = mysql_escape_string($_POST['url']);

  }

    // 2. Блок проверки имени на уникальность

  /////////////////////////////////////////////////

  // Устанавливаем соединение с базой данных

  require_once("Connect_BD.php"); // подключаем файл для соединения с базой данных Mydata

  // Проверяем, не было ли переданное имя зарегистрировано ранее

  $query = "SELECT COUNT(*) FROM userslist WHERE name = '$_POST[name]'";

  $usr = mysql_query($query);

  if(!$usr) exit("Ошибка 1 - ".mysql_error());

  $total = mysql_result($usr, userslist.name);

  echo "total = $total если равно нулю, такое имя в БД отсутствует и может быть зарегистрировано";

  if($total > 0)

  {

    exit("Данное имя уже зарегистрировано, пожалуйста, выберите другое");

  }

// зашифруем пароль с помощью функции MD5()

    $parol =$_POST['parol']; $parol = md5($parol);

// в базе данных у нас будет храниться пароль зашифрованный и проверять его при авторизации

// надо будет сравнивать с зашифрованным, т.е. md5()$parol = md5('parol')

  /////////////////////////////////////////////////

  // 3. Блок регистрации пользователя

  /////////////////////////////////////////////////

  // Формируем и выполняем SQL-запрос на

  // добавление нового пользователя по формату MySQL значения хранятся в суперглобальном массиве $_POST[]

// запишем в базу данных userslist нового пользователя, пароль, любимое блюдо, электронный адрес, url адрес

  $bludo = trim($_POST['bludo']);

  $query = "INSERT INTO userslist ( `name` , `parol` , `parol_again` , `email` , `url` )

            VALUES('$name','$parol', '$bludo', '$email', '$url')";

  if(mysql_query($query))

  {  

//   если все впорядке (добавили пользователя), то найдем его номер в базе данных

// номер хранится в поле "n" и индексируется автоматически

      $query = "SELECT * FROM userslist WHERE name = '$name'"; // сформировали запрос для MySql

      $result = mysql_query($query);    // выполнили запрос

      echo "<p> result2 = $result</p>";  // отладочная печать - интересно посмотреть что там

      $num = mysql_num_rows($result);   // получим количество найденных записей

// в принципе имена не повторяются, но вдруг ...

     echo "<p>$num записи(ей) найдено!</p>";

     $i=0;

     while($i < $num) // обычный цикл while выполняются операторы в скобках, пока условие выполняется

    {

      $n = mysql_result($result,$i, 'userslist.n');  // получили пароль из базы данных

      $i++;

     }

       echo "<p>n = $n   name = $name</p>";

       create_tab($n,$name, $email); // функция создаст таблицу пользователя

     

// Осуществляем перезагрузку начальной страницы

  include "index2.php"; 

  }

  else exit("Ошибка при добавлении данных - ".mysql_error());

?>

Мы описали алгоритмы и привели страницы html  для регистрации и авторизации на сайте. А сейчас "наступил момент" в нашем алгоритме, когда  пользователь забыл пароль и попытается его восстановить (изменить).

Форма html страничке приведена в файле "av_email.htm".

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

<title>Форма для регистрации в базе данных</title>

</head>

<body>

<center>

  <p>Необходимо подтвердить имя, email и ввести новый пароль<br>

     и если Вы вводили при регистрации, то и <span lang="en-us">'</span>Ваше любимое блюдо<span lang="en-us">'</span></p>

<form action='pass_prg.php' method='post'>

<table border='0'>

<tr><td>Имя (<font color="#FF0000">*</font>):</td>    <td><input type=text name=name></td></tr>

 <tr><td>E-mail (<font color="#FF0000">*</font>):</td> <td><input type=text name=email></td></tr>

  <tr><td><span lang="ru">Новый пароль (<font color="#FF0000">*</font>):</td>      <td><input type='password' size='20' name='parol' /></td></tr>

  <tr><td>Подтверждение нового пароля (<font color="#FF0000">*</font>):</td> <td> <input type='password' size='20' name='parol_again' /></td> </tr>

  <tr><td>Ваше любимое блюдо: </td> <td><input type=text name='bludo'></td></tr>

  </table>

  <input type='submit' name='submit' value='Зарегистрироваться повторно' style="color: #008000; font-weight: bold; font-family: Times New Roman; font-size: 12pt">

  </form>

  </center>  

</body>

</html>

Этот текст не должен вызывать у вас непонимание, так как это обычная страница html с формой.

Файл обработчик этой формы является "pass_prg.php", текст которого приведен ниже.

Файл "pass_prg.php",

<?php

include "Connect_BD.php"; //подключаемся к серверу MySql и к базе данных Fish

// далее сжимаем пробелы из введенных данных - дело в том, что при вводе данных

// (имени или пароля и т.п.) может попасться пробел слева или справа строки

// при нажатии клавиши "пробел" - используем функцию trim()

  $parol = md5(trim($_POST['parol']));

  $name = trim($_POST['name']);

  $email = trim($_POST['email']);

  $bludo = trim($_POST['bludo']);

 //  echo "<p>$parol    $name     $email</p>";  отладочная печать - уберите слеши для включения

 if (empty($bludo))

    $query = "UPDATE userslist SET parol = '$parol' WHERE name = '$name' AND email = '$email'";

 else  

    $query = "UPDATE userslist SET parol = '$parol' WHERE name = '$name' AND email = '$email' AND parol_again = '$bludo'";

// echo "<p>$query</p>";   //отладочная печать - уберите слеши для включения

  if(mysql_query($query))

    { echo "<p>Данные введены и изменены!</p>"; 

      include "index2.php"; 

     }

  else exit("Ошибка при добавлении данных - ".mysql_error());

?>

Все приведенные примеры программ имеют комментарии и по ним очень легко понять, как работают программы на языке PHP и как они взаимодействуют со страницами html через тег формы <Form …… /Form> и его элементами.

Однако, чем дальше в лес, тем больше дров. Это я о языке программирования PHP. Мы познакомились лишь с некоторыми приемами программирования, и далее нас ждет знакомство с удивительными и полезными возможностями языка PHP при создании динамических страниц на ваших сайтах.

Главная 

 

1. Что такое PHP?

1. 1. Применение РНР при программировании сайтов

1.2. Программа регистрации и авторизации на вашем сайте

1.3. Программа регистрации и авторизации на сайте с шифрованием пароля

2. Глава посвящена программированию
вообще и программированию в частности
сайтов

3. MySQL элементы управления и взаимодействие с PHP

4. Русский перевод файла "httpd.conf" Для Apache 2.0

5. Русский перевод файла "php.ini"

 

При использовании данного материала, ссылка на сайт ОБЯЗАТЕЛЬНА