Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скрипт авторизации и регистрации 
:(
    Опции темы
sanchos14931
Дата 15.3.2009, 12:40 (ссылка)    | (голосов:7) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 27.5.2008
Где: Нягань

Репутация: нет
Всего: нет



Здравствуйте форумчане!!!

Я облазил весь интернет в поиске скрипта регистрации подходящего для меня.. 
Все таки я нашел этот скрипт и как его делать!!
Мне кажется что многие тоже ходят по просторам интернета в поисках этого скрипта.. 
Я бы хотел тоже с вами поделится!!!!


Рассмотрим систему авторизации пользователей (регистрация, login/logout, доступ к закрытым страничкам, поддтвеждение по e-mail).

Нам понадобятся: вебсервер, PHP, MySQL. Предполагается, что вы с этим всем уже знакомы на определенном уровне.

Для начала создадим в базу данных, допустим, "authorize" и таблицу "users" в ней. Работать с БД MySQL очень удобно с помощью инструмента PhpMyAdmin, который можно скачать здесь.

Итак, таблица "users":
Поле                 Тип             По умолчанию    Дополнительно
id                 mediumint(9)                               auto_increment
login             varchar(32)                                 index unique
pass             varchar(32)        
email             varchar(64)                                 index unique
status             tinyint(2)                 0    
timestamp        int(10)        


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

Код

<form action="registration.php" method="post">
<table>
<tr>
   <td>Логин* :</td>
   <td><input type="text" name="rLogin" value="" size="25" maxlength="30" /></td>
</tr>
<tr>
   <td>Пароль* :</td>
   <td><input type="password" name="rPass" value="" size="25" maxlength="30" /></td>
</tr>
<tr>
   <td>Повторите пароль* :</td>
   <td><input type="password" name="rPass2" value="" size="25" maxlength="30" /></td>
</tr>
<tr>
   <td>E-mail* :</td>
   <td><input type="text" name="rEmail" value="" size="25" maxlength="30" /></td>
</tr>
<tr>
   <td></td>
   <td><input type="reset" name="reset" value="Очистить" />
       <input type="submit" name="ok" value="Готово" /></td>
</tr>
</table>
</form>



На этом этапе стоит упомянуть о том, что полезно в таких случаях кроме проверок правильности введенных данных на сервере, делать такую проверку средствами Javascript. Например, если юзер ввел повтор пароля неверно, подсвечивать красным соответвующую строку. Это не сложно, поэтому расскажем об этом в следующий раз.

Теперь создадим скрипт "registration.php", который и будет обрабатывать форму регистрации:

Код

<?
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
   $rLogin = trim($_POST['rLogin']);
   $rPass  = trim($_POST['rPass']);
   $rPass2 = trim($_POST['rPass2']);
   $rEmail = trim($_POST['rEmail']);
   if ($rLogin == '') {
      die("Поле 'Логин' не заполнено<br />\n");
   // Логин может состоять из букв, цифр и подчеркивания
   }elseif (!preg_match("/^\w{3,}$/", $rLogin)) {
      die("В поле 'Логин' введены недопустимые символы<br />\n");
   }
   if ($rEmail == '') {
      die("Поле 'E-mail' не заполнено<br />\n");
   // Проверяем e-mail на корректность
   }elseif (!preg_match("/^[a-zA-Z0-9_\.\-]+@([a-zA-Z0-9\-]+\.)+[a-zA-Z]{2,6}$/", $rEmail)) {
      die("Указанный 'E-mail' имеет недопустимый формат<br />\n");
   }
   if ($rPass == '' || $rPass2 == '') {
      die("Поле 'Пароль' не заполнено<br />\n");
   }elseif($rPass !== $rPass2) {
      die("Поля 'Пароль' и 'Повтор пароля' не совпадают<br />\n");
   // Пароль может состоять из букв, цифр и подчеркивания
   }elseif(!preg_match("/^\w{3,}$/", $rPass)) {
      die("В поле 'Пароль' введены недопустимые символы<br />\n");
   }
   // В базе данных у нас будет храниться md5-хеш пароля
   $mdPassword = md5($rPass);
   // А также временная метка (зачем - позже)
   $time = time();
   // Устанавливаем соединение с бд(не забудьте подставить ваши значения сервер-логин-пароль)
   $link = mysql_connect('localhost', $dbuser, $dbpass);
   if (!$link) {
      die("Не могу соединиться с базой данных");
   }else {
      // Выбираем базу данных
      mysql_select_db('authorize', $link);
      // Записываем в базу (не используем addslashes - экранировать нечего)
      mysql_query("INSERT INTO users (login, pass, email, timestamp)
                   VALUES ('$rLogin','$mdPassword','$rEmail',$time)",$link);
      if (mysql_error($link) != "") {
         die("Пользователь с таким логином уже существует, выберите другой<br />\n");
      }
      echo "Юзер добавлен<br />\n";
      mysql_close($link);
   }
}
?>


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

Теперь мы должны выслать юзеру на указанный e-mail письмо со ссылкой для подтверждения регистрации. Для этого вместо строчки echo "Юзер добавлен<br />\n"; вставим такой кусок кода:

Код

// Получаем Id, под которым юзер добавился в базу
$id = mysql_result(mysql_query("SELECT LAST_INSERT_ID()", $link), 0);
// Составляем "keystring" для активации
$key = md5(substr($rEmail, 0 ,2).$id.substr($rLogin, 0 ,2));
$date = date("d.m.Y",$time);
// Компонуем письмо
$title = 'Потвеждение регистрации на сайте Somwhere.net';
$headers  = "Content-type: text/plain; charset=windows-1251\r\n";
$headers .= "From: Администрация Somwhere.net \r\n";
$subject = '=?koi8-r?B?'.base64_encode(convert_cyr_string($title, "w","k")).'?=';
$letter = <<< LTR
   Здравствуйте!
   бла-бла
   
   Ваши регистрационные данные:
      логин: $rLogin
      пароль: $rPass
   
   Для активации аккаунта вам следует пройти по ссылке:
   http://somewhere.net/activation.php?login=$rLogin&key=$key
   
   Данная ссылка будет доступна в течении 5 дней.
   
   $date
LTR;
// Отправляем письмо
if (!mail($rEmail, $subject, $letter, $headers)) {
   // Если письмо не отправилось, удаляем юзера из базы
   mysql_query("DELETE FROM users WHERE login='".$login."' LIMIT 1", $link);
   echo 'Произошла ошибка при отправке письма. Попробуйте зарегистрироваться еще раз.';
}else {
   echo 'Вы успешно зарегистрировались в системе. На указанный вами
   e-mail было отправлено письмо со ссылкой для активации аккаунта.
   У вас 5 дней!';
}


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

Кстати о письме: правила составления ключевой строки "keystring" никем не писаны и каждый может придумать что-нибудь свое. Например, при каждой регистрации можно генерировать случайное слово и, записав в базу, на его основе генерить "keystring".

Теперь у нас в таблице "users" должна быть строка вида:
1   login   76d80224611fc919a5d54f0ff9fba446   [email protected]   0   1197730343

Теперь создадим скрипт, активирующий пользователей. Система его будет такова:
• Пользователь приходит по ссылке с GET-данными "login" и "key"
• Берем из базы id, login, e-mail, status и timestamp юзера (если юзер есть). Проверяем статус (активирован уже или нет). Проверяем разницу текущей временной метки и метки из базы, если больше 5*24*60*60 - до свидания
• Составляем новую "keystring" по тем же правилам, что и старую. Сравниваем. Не равны - до свидания
• Если ключевые строки равны - апдейтим статус до 1.

А код таков:
Код

<?
if (isset($_GET['login']) && isset($_GET['key'])) {
   $login = $_GET['login'];
   $key = $_GET['key'];
   // Делаем проверку login на нехорошие символы
   if (!preg_match("/^\w{3,}$/", $login)) {
      die('Неправильная ссылка!');
   }
   $time = time();
   $link = mysql_connect('localhost',$dbuser,$dbpass);
   if (!$link) {
      die('Не удалось соединиться с БД');
   }else{
      mysql_select_db('authorize', $link);
      $res = mysql_query("SELECT id, email, status, timestamp
      FROM users WHERE login='$login' LIMIT 1", $link);
      // Есть ли пользователь с таким логином?
      if (mysql_num_rows($res) != 1) {
         mysql_close($link);
         die('Такого пользователя нет!');
      }
      $user = mysql_fetch_row($res);
      // Может он уже активен?
      if ($user[2] == 1) {
         mysql_close($link);
         die('Данный логин уже подтвержден!');
      }
      // Успел ли юзер активировать логин? (если нет - удаляем из базы)
      if ($user[3] - $time > 5*24*60*60) {
         mysql_query("DELETE FROM users WHERE login='$login' LIMIT 1", $link);
         mysql_close($link);
         die('Срок активации истёк! Регистрируйтесь заново.');
      }
      $key1 = md5(substr($user[1], 0 ,2).$user[0].substr($login, 0 ,2));
      // Поверяем "keystring"
      if ($key1 != $key) {
         mysql_close($link);
         die('Неправильная контрольная сумма!');
      }
      // Если все проверки пройдены - активируем логин!
      mysql_query("UPDATE users SET status = 1 WHERE login='$login'", $link);
      mysql_close($link);
   }
}
?>



Так, с регистрацией мы покончили, теперь сделаем форму для авторизации, например, такую:
Код

<form method="post" action="login.php">
   <table>
   <tr>
      <td>Логин</td>
      <td><input type="text" name="login"></td>
   </tr>
   <tr>
      <td>Пароль</td>
      <td><input type="password" name="password"></td>
   </tr>
   <tr>
      <td colspan="2"><input type="submit" value="Войти"></td>
   </tr>
   </table>
</form>


Вставляйте эту форму в любое место страницы, как того требует дизайн. Обработчиком формы будет у нас файл "login.php" такого вида:
Код

<?
if (isset($_POST['login'])) {
   $passwordHash = md5($_POST['password']);
   $login = $_POST['login'];
   // Проверка логина на плохие смиволы
   if (!preg_match("/^\w{3,}$/", $login)) {
      die('Неправильный логин!');
   }
   $link = mysql_connect('localhost',$dbuser,$dbpass);
   if (!$link) {
      die('Не удалось соединиться с БД');
   }else{
      mysql_select_db('authorize', $link);
      $res = mysql_query("SELECT status FROM users WHERE login='$login'", $link);
      // Есть ли пользователь с таким логином?
      if (mysql_num_rows($res) < 1) {
         mysql_close($link);
         die('Такого пользователя нет!');
      }
      // Какой статус у пользователя?
      if (mysql_result($res, 0) != 1) {
         mysql_close($link);
         die('Логин не активирован!');
      }
      // Стартуем сессию и записываем логин в суперглобальный массив $_SESSION
      session_start();
      $_SESSION['user'] = $login;
      mysql_close($link);
      // Если определена страница с которой мы пришли,
      // на нее и переадресуем, либо на главную
      if (isset($_SERVER['HTTP_REFERER'])) {
         header ("location: ".$_SERVER['HTTP_REFERER']);
      }else {
         header ("location: index.php");
      }
   }
}
?>


Напишем сразу скрипт "logout.php", работающий как "выход из системы":
Код

<?
   session_start();
   if (isset($_SESSION['user'])) {
   // удаляем элемент "user"
      unset($_SESSION['user']);
   }
   if (isset($_SERVER['HTTP_REFERER'])) {
      header ("location: ".$_SERVER['HTTP_REFERER']);
   }else {
      header ("location: index.php");
   }
?>


Ну вот, юзер авторизован. Осталась малость:
• В начале каждого документа стартовать сессию функцией session_start()
• Проводить проверку на присутствие в массиве $_SESSION элемента user. На основе нее выдавать "секретный" документ или общий.
• Вместо формы для авторизации распечатывать приветствие и ссылку на "logout.php"

Вот простейший пример документа:
Код

<?
session_start();
if (isset($_SESSION['user'])) {
   $auth = "Привет ".$_SESSION['user']."!<br />\n";
   $auth .= "<a href='logout.php'>Выйти</a>";
   $docum = "Эта информация только для зарегистрированных";
}else {
   $auth = <<< AUTH
   <form method="post" action="login.php">
      <table>
      <tr>
         <td>Логин</td>
         <td><input type="text" name="login"></td>
      </tr>
      <tr>
         <td>Пароль</td>
         <td><input type="password" name="password"></td>
      </tr>
      <tr>
         <td colspan="2"><input type="submit" value="Войти"></td>
      </tr>
      </table>
   </form>
AUTH;
   $docum = "Эта общая информация";
}
?>
<html>
<head>
</head>
<body>
<? echo $auth; ?>
<hr />
<? echo $docum; ?>
</body>
</html>


Ну вот вроде и все. 





Продолжение:



В обсуждении и разборе моей давней статьи о системе авторизации на PHP и MySQL, кто-то интересовался как сделать опцию "Запомнить" и автоматический вход. Это довольно просто, но так как есть желающие - нужно подробно описать. Я не буду повторять предыдущую статью, а буду на нее ссылаться.

Итак, в форме авторизации добавляем чекбокс для запоминания:
Код

<input type="checkbox" name="remember">


Теперь смотрим наш обработчик этой формы - скрипт "login.php". Сначала рассмотрим т.н. первую авторизацию — при удачной авторизации и если отмечена опция "запомнить", пишем в cookie браузера специальную строку token. Эти строки нужно добавить после открытия сессии в файле "login.php":
Код

$token = md5(time().$login);
if ($_POST['remember']) {
   setcookie('token', $token, time() + 60 * 60 * 24 * 14);
}


Сразу после этого, нужно записать ту же строку token, в базу данных, в строку для залогинившегося юзера. Впоследствии мы будем искать по этой строке (когда она придет из куки) нужного пользователя.
 
Код

  mysql_query("UPDATE users SET token='$token' WHERE login='$login'");


Ну вот, теперь остался последний шаг — авторизовать посетителя автоматически при его заходе на сайт. Для этого, после старта сессии, в каждом документе нужно сделать такую проверку:
Код

if (isset($_COOKIE['token']) && !isset($_SESSION['user'])) {
   $token = htmlspecialchars($_COOKIE['token']); // на всякий сл.
   $res = mysql_query("SELECT login FROM users WHERE token='$token'", $link);
   if (mysql_num_rows($res) < 1) {
      setcookie('token', '');
   }else {
      $_SESSION['user'] = mysql_result($res, 0);
   }
}


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

Ну и последний штрих: в скрипте "logout.php", при удалении из сессии пользователя, удаляем его куку:
Код

setcookie('token', '');


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


Источник: http://alt-f4.ru/avtorizaciya-posetiteley-php-mysql


Модератора прошу закрепить эту тему...  smile 

Это сообщение отредактировал(а) sanchos14931 - 15.3.2009, 12:44
PM MAIL WWW ICQ   Вверх
Djinn
Дата 24.4.2009, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 18.5.2007

Репутация: 1
Всего: 1



коментировать скрипт не буду smile но вот 
Код

!preg_match("/^[a-zA-Z0-9_\.\-]+@([a-zA-Z0-9\-]+\.)+[a-zA-Z]{2,6}$/", $rEmail)

не совсем удочно smile лучше будет: http://ua2.php.net/manual/ru/function.filter-var.php
Код

!preg_match("/^\w{3,}$/", $login)

в подобном лучше указывать лимит символов, ато БД ошибку покажет, если много символов ввести - 100, например... дальше тоже есть что поправить... ну да ладно, думаю

 smile а вообще хорошо что есть люди которые делятся данными которые нужны для других (наверное нужны...)
PM MAIL   Вверх
MoLeX
Дата 24.4.2009, 14:41 (ссылка) |   (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



Цитата(sanchos14931 @  15.3.2009,  12:40 Найти цитируемый пост)
Мне кажется что многие тоже ходят по просторам интернета в поисках этого скрипта.. 
Я бы хотел тоже с вами поделится!!!!

ерунда... зачем искать когда быстрее самому сделать?

Добавлено через 2 минуты и 48 секунд

M
MoLeX
Модератор: sanchos14931, отредактируйте свой текст (жирноту уберите)



--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
enof
Дата 24.4.2009, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 837
Регистрация: 23.1.2009
Где: Санкт-Петербург

Репутация: 30
Всего: 35



Цитата(sanchos14931 @  15.3.2009,  13:40 Найти цитируемый пост)
$token = md5(time().$login);

За такие советы расстреливать надо. Например на таком сайте отображается список кто онлайн.
Сижу я значит и мониторю этот список. Как только кто новый появится, сразу брутим. Через минуту у нас есть чужой аккаунт.
Цитата(sanchos14931 @  15.3.2009,  13:40 Найти цитируемый пост)
   $token = htmlspecialchars($_COOKIE['token']); // на всякий сл.

 smile

Добавлено через 2 минуты и 19 секунд
Цитата(sanchos14931 @  15.3.2009,  13:40 Найти цитируемый пост)
   $res = mysql_query("SELECT login FROM users WHERE token='$token'", $link);

это вообще ###.
PM MAIL ICQ Skype   Вверх
Mpak
Дата 25.4.2009, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 12.11.2006

Репутация: нет
Всего: 7



Цитата(sanchos14931 @  15.3.2009,  15:40 Найти цитируемый пост)
Я облазил весь интернет в поиске скрипта регистрации подходящего для меня.. Все таки я нашел этот скрипт и как его делать!!Мне кажется что многие тоже ходят по просторам интернета в поисках этого скрипта.. Я бы хотел тоже с вами поделится!!!!

Видать плохо искали ;) бдыщ


--------------------
В любой откомпилированной программе есть, по крайней мере, одна ошибка...
P.S. А у меня их минимум две...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1226 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.