Как грамотно сделать регистрацию, авторизацию и восстановление пароля?

FRIE

Новичок
Как грамотно сделать регистрацию, авторизацию и восстановление пароля?

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

Суть темы заключается в том что по мере создания я буду выкладывать скрипты , а желающие могут помочь продумать логику , предложить свои идеи, покритиковать , рассказать о каких то нюансах которые я не учёл

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

Подумав немного я понял что нужно создать 3 скрипта

1. Авторизация
2. Регистрация
4. Восстановление пароля

Исходный скрипт авторизации я выложу ниже

-~{}~ 12.02.10 14:02:
PHP:
<?php

require ("connect_db.php"); 

	echo "
<H3 class='login1'>Login</H3>
<form  method='post'>
   <input type='text' name='login' maxlength='25' size='20'  class='username'  
   value='логин'  onfocus='if (this.value=='логин') this.value=''' />
   <input type='password' name='password' maxlength='25' size='20' class='password'/><br />
  <div style='float: left; width:168px; margin-top:5px;'> <input type='submit' value='Войти' class='submit'/><a href='/register_form.php' target='_top' class='reg'>Регистрация</a><br /></div>
  </form>

<div style='float: left; width:164px; margin-left:7px;_margin-left:4px; '><div style='float: left; width: 15px;'><input name='account_infinite' value='1' class='radiocheck' style='margin-top: 5pt; width: 13px; height: 13px;' type='checkbox'></div><div style='padding: 5px 0pt 0pt 5px; font-size:12px; font-family:Verdana, Geneva, sans-serif;margin-left:7px;'>запомнить меня</div></div>
";

	if (isset($_POST['login']) && isset($_POST['password']))
{
    $login = mysql_real_escape_string($_POST['login']);
    $password = md5($_POST['password']);
	$query = "SELECT id,login FROM users WHERE login='{$login}' AND password='{$password}' LIMIT 1";
    $sql = mysql_query($query) or die(mysql_error());
// если такой пользователь нашелся
    if (mysql_num_rows($sql) == 1) {
        // то мы ставим об этом метку в сессии (ID пользователя)
    $row = mysql_fetch_assoc($sql);
        $_SESSION['user_id'] = $row['id'];
		$_SESSION['name'] = $row['login'];
    }
    else {
        echo 'Такой логин с паролем не найдены <br>';
    }
}

?>
 

Beavis

Banned
FRIE
возьми за основу учебный скрипт авторизации, написанный *****ом.
а то что ты тут написал, читать невозможно
 

FRIE

Новичок
Таблица users в ней поля id login и password, пароли храняться в md5 хэше



Коментарий к коду авторизации:

Сдесь вроде бы ничего такого особенного не вижу - происходит поиск поиск в базе на наличие соответствия логина и пароля тем что введены в форме и если соответствие найдено то в переменную сессии добавляется id и login пользователя.
Как я думаю - проверок введенных данных сдесь не требуется так как к базе идет просто запрос select


я пока буду делать скрипт регистрации

-~{}~ 12.02.10 15:17:

Автор оригинала: Beavis
FRIE
возьми за основу учебный скрипт авторизации, написанный *****ом.
а то что ты тут написал, читать невозможно
кем кем написанный?

и что тут тебе невозможно читать?
 

dimagolov

Новичок
FRIE, берешь в поиск по форуму вбиваешь "учебный скрипт авторизации"
 

Фанат

oncle terrible
Команда форума
В принципе, нормальная авторизация.
Осталось только дописать проверку, но это 2 строчки.

Регистрация ничем принципиально не отличается от добавления записи в гостевую книгу, то есть, тоже пишется элементарно

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

Beavis

Banned
Автор оригинала: FRIE
и что тут тебе невозможно читать?
PHP:
	echo "
<H3 class='login1'>Login</H3>
<form  method='post'>
   <input type='text' name='login' maxlength='25' size='20'  class='username'  
   value='логин'  onfocus='if (this.value=='логин') this.value=''' />
   <input type='password' name='password' maxlength='25' size='20' class='password'/><br />
  <div style='float: left; width:168px; margin-top:5px;'> <input type='submit' value='Войти' class='submit'/><a href='/register_form.php' target='_top' class='reg'>Регистрация</a><br /></div>
  </form>

<div style='float: left; width:164px; margin-left:7px;_margin-left:4px; '><div style='float: left; width: 15px;'><input name='account_infinite' value='1' class='radiocheck' style='margin-top: 5pt; width: 13px; height: 13px;' type='checkbox'></div><div style='padding: 5px 0pt 0pt 5px; font-size:12px; font-family:Verdana, Geneva, sans-serif;margin-left:7px;'>запомнить меня</div></div>
";
а тебе самому не кажется, что это по-меньшей мере, выглядит как то не так?

кто тебя учил выводить весь HTML с помощью echo ?
 

Sigorma

Новичок
script: auth.php

PHP:
<?php
require ("connect_db.php"); 

if($_SERVER['REQUEST_METHOD'] == "POST")
{
	# Пример авторизации с помощью сессий
	# phpfaq.ru/sessions
}
?>

<H3 class='login1'>Login</H3>
<form  method='post'>
 <input type='text' name='login' value='' />
 <input type='password' name='password' />
 <br />
 <div style='float: left; width:168px; margin-top:5px;'>
  <input type='submit' value='Войти' class='submit'/>
 </div>
</form>

дальше сам разберешься ;)
 

FRIE

Новичок
Автор оригинала: Beavis
PHP:
	echo "
<H3 class='login1'>Login</H3>
<form  method='post'>
   <input type='text' name='login' maxlength='25' size='20'  class='username'  
   value='логин'  onfocus='if (this.value=='логин') this.value=''' />
   <input type='password' name='password' maxlength='25' size='20' class='password'/><br />
  <div style='float: left; width:168px; margin-top:5px;'> <input type='submit' value='Войти' class='submit'/><a href='/register_form.php' target='_top' class='reg'>Регистрация</a><br /></div>
  </form>

<div style='float: left; width:164px; margin-left:7px;_margin-left:4px; '><div style='float: left; width: 15px;'><input name='account_infinite' value='1' class='radiocheck' style='margin-top: 5pt; width: 13px; height: 13px;' type='checkbox'></div><div style='padding: 5px 0pt 0pt 5px; font-size:12px; font-family:Verdana, Geneva, sans-serif;margin-left:7px;'>запомнить меня</div></div>
";
а тебе самому не кажется, что это по-меньшей мере, выглядит как то не так?

кто тебя учил выводить весь HTML с помощью echo ?
а как надо выводить ?
 

Beavis

Banned
FRIE
прям над твоим сообщением пример как надо правильно выводить, и, самое главное, ГДЕ выводить
 

FRIE

Новичок
Давненько меня тут небыло, но я без дела не сидел и вот что я намутил, ниже я выложу измененный скрипт
авторизации , созданный скрипт регистрации , и скрипт с функциями

Товарищи !! не забываем комментировать и предлагать что то добавить либо удалить
напомню - что я хочу сделать полностью защищенные от вторжений и sql иньекций ,
и от ошибок пользователей, скрипты авторизации регистрации и восстановления пароля

Пока сделано :

Авторизация
Регистрация

Осталось:

Подтверждение регистрации
Восстановление пароля






reg.php





PHP:
<?php 
  require ("../scripts/connect_db.php"); 
  require ("functions.php");
  if (isset($_POST['login'])) {$login= $_POST['login'] ; if ($login == '') {unset ($login);} } 
//делаем из глобальной переменной обычную и если она пустая то удаляем
//то же самое делаем и с остальными переменными
  if(isset($_POST['mail'])) {$mail= $_POST['mail']  ; if ($mail == '') {unset ($mail);} } 
  if(isset($_POST['password1'])) {$password1= $_POST['password1']  ; if ($password1 == '') {unset ($password1);} } 
  if(isset($_POST['password2'])) {$password2= $_POST['password2']  ; if ($password2 == '') {unset ($password2);} } 

	  
  if (isset ($login) && isset($mail) && isset($password1) && isset($password2) ){//если все поля формы заполнены то продолжаем
	  $login = mysql_real_escape_string($_POST['login']); //экранируем символы
	  $login = strtolower($login); // преобразуем все буквы в нижний регистр
	  $login = trim($login); //удаляем пробелы в начале и в конце строки
	  
	  $mail = mysql_real_escape_string($_POST['mail']); //экранируем символы
	  $mail = strtolower($mail); // преобразуем все буквы в нижний регистр
	  $mail = trim($mail); //удаляем пробелы в начале и в конце строки
	  
	  $password1 = mysql_real_escape_string($_POST['password1']); //экранируем символы
	  $password1 = trim($password1); //удаляем пробелы в начале и в конце строки
	  
	  $password2 = mysql_real_escape_string($_POST['password2']); //экранируем символы
	  $password2 = trim($password2); //удаляем пробелы в начале и в конце строки
	 
   if (!escape_inj ($login )) { // Проверяем функцией которая проверяет наличие слов select insert итд.. 
странно но когда я регистрируюсь с логином select то регистрация всёравно проходит . 
этот скрипт я откудато взял те писал его не сам =)) так что работает он или нет я понятия не имею . 
регистрация проходит в любом случае
   echo "Это SQL-инъекция.";
   exit ();}      
      else { //смотрим есть ли пользователь с таким логином
      $query = mysql_query("SELECT `login` FROM `users` WHERE `login`='$login'");}
	   
	  if (mysql_num_rows ($query) >0 ){echo "такой логин занят";} // если есть выводим сообщение что есть такой юзер
	  elseif (strlen($password1)<4){ echo"пароль должен состоять не менее чем из 4 знаков"; }//проверяем чтобы 
пароль состоял не менее      чем из 4 знаков
      elseif ($password1!==$password2){echo"введенные пароли не совпадают";} // проверяем чтобы введенные пароли совпадали
	  
      elseif(CheckEmail($mail) == FALSE){echo "E-mail не верный";} // функцией проверяем правильно ли введен e-mail
	  
      else{    //если всё без косяков то шифруем пароль и заносим данные в базу
	  $password3 = md5($password1);
	  $insert_user = mysql_query ("INSERT INTO `users` (`login`,`password`,`email`) VALUES ('$login', '$password3', '$mail')");
	  echo  "Поздравляем ! Вы успешно зарегистрировались =))))";
      }
      }
      else echo "Для регистрации необходимо заполнить все поля формы"//если гдето косяки то говорим Ахтунг!!
	  
?>

functions.php
PHP:
<?php
//проверка  e-mail на то что e-mail ли это вообще
function CheckEmail($Email){
if (!eregi("^[\._a-zA-Z0-9-]+@[\.a-zA-Z0-9-]+\.[a-z]{2,6}$", $Email)) return false;
list($Username, $Domain) = split("@",$Email);
if (@getmxrr($Domain, $MXHost)) return true;
else    {
    $f=@fsockopen($Domain, 25, $errno, $errstr, 30);
    if($f){
          fclose($f);
          return 0;}
    else return false;
}} 

//проверка на слова к базе данных 
function escape_inj ($text) {
  $text = strtolower($text); // Приравниваем текст параметра к нижнему регистру
  if (
    !strpos($text, "select") && //
    !strpos($text, "union") && //
    !strpos($text, "select") && //
    !strpos($text, "order") && // Ищем вхождение слов в параметре
    !strpos($text, "where") && //
    !strpos($text, "char") && //
    !strpos($text, "from") //
  ) {
    return true; // Вхождений нету - возвращаем true
  } else {
    return false; // Вхождения есть - возвращаем false
  }
}




?>
login.php


<form method='post'><H3 class='login1'>Login</H3>
<input type='text' name='login' maxlength='25' size='20' class='username'
value='логин' onfocus='if (this.value=='логин') this.value=''' />
<input type='password' name='password' maxlength='25' size='20' class='password'/><br />
<div style='float: left; width:168px; margin-top:5px;'> <input type='submit' value='Войти' class='submit'/>
<a href='../main/registration.php' target='_top' class='reg'>Регистрация</a><br />
</div>
</form>

<div style='float: left; width:164px; margin-left:4px; '><div style='float: left; width: 15px;'>
<input name='account_infinite' value='1' class='radiocheck' style=' width: 13px; height: 13px;' type='checkbox'></div>
<div style=' font-size:12px; font-family:Verdana, Geneva, sans-serif;'>запомнить меня</div></div>

PHP:
<?php

require ("connect_db.php"); 

	


	if (isset($_POST['login']) && isset($_POST['password'])&&($_POST['password'] !== '')&&($_POST['login'] !== ''))
{
    $login = mysql_real_escape_string($_POST['login']);//экранируем символы
	$login = strtolower($login); // преобразуем все буквы в нижний регистр
	$login = trim($login); //удаляем пробелы в начале и в конце строки
	 
	$password = mysql_real_escape_string($_POST['password']); //экранируем символы
	$password2 = trim($password2);//удаляем пробелы в начале и в конце строки
    $password = md5($_POST['password']);
	
    $query = "SELECT `id`,`login`
            FROM `users`
            WHERE `login`='{$login}' AND `password`='{$password}'
            LIMIT 1";
    $sql = mysql_query($query) or die(mysql_error());
// если такой пользователь нашелся
    if (mysql_num_rows($sql) == 1) {
        // то мы ставим об этом метку в сессии (будем ставить ID пользователя)
        $row = mysql_fetch_assoc($sql);
        $_SESSION['user_id'] = $row['id'];
		$_SESSION['name'] = $row['login'];
		}
    else {//если логин с паролем не найдены то выводим сообщение
        echo 'Такой логин с паролем не найдены <br>';
    }
}

?>
-~{}~ 21.02.10 21:32:

я пока пойду пить пиво =)
 

Духовность™

Продвинутый новичок
if (isset($_POST['login'])) {$login= $_POST['login'] ; if ($login == '') {unset ($login);} }
Ты что-нибудь слышал про стандарты кодирования? Знаешь такое понятие и для чего его придумали? Читать быстро статьи на эту тему!!!!111!11
 

FRIE

Новичок
Автор оригинала: triumvirat
Ты что-нибудь слышал про стандарты кодирования? Знаешь такое понятие и для чего его придумали? Читать быстро статьи на эту тему!!!!111!11
это ты про то что у меня конструкция в одну строчку идёт? это я специально чтобы не занимать тут много места

или ты про что-то другое?

ЗЫ : сам код у меня рабочий , перед тем как выложить проверил кучу раз, у меня в базе больше 50 юзеров зарегестрировано моими руками)))


Могу выложить нормально отформатированный код, вы только скажите. Просто не хотел здесь много места тратить
 

Фанат

oncle terrible
Команда форума
triumvirat
а более серьезных фейлов нету, что ты к формату начал придираться?

-~{}~ 21.02.10 22:24:

глубокомысленная функция escape_inj, например, - чем не повод скушать автора с навозом и лишний раз показать всем, какой ты умный?
 

Духовность™

Продвинутый новичок
if (isset($_POST['login'])) {$login= $_POST['login'] ; if ($login == '') {unset ($login);} }
скажи пожалуйста, для чего ты делаешь все эти операции?
$login = strtolower($login);
ого как! т.е. если я ввожу логин Vasya, то мой логин дефакто становится vasya и я не могу попасть в систему. оригинально. какой большой смысл делать strtolower?
цикл foreach знаешь? сможешь пройтись по всем пост-данным и удалить пробелы таким образом?
наличие этой функции говорит о том, что про SQL инъекции ты слышал, но на практике даже не пытался написать потенциально опасный запрос и вообще понять, как это все работает. Ты думаешь, что разработчики SQL базы такие дураки, что использование их СУБД без идиотской функции escape_inj невозможно?

-~{}~ 21.02.10 22:28:

*****
пока ты писал, я как раз смешал автора с навозом и намазал на хлеб. сейчас скушаю.
 

Beavis

Banned
Автор оригинала: triumvirat
цикл foreach знаешь? сможешь пройтись по всем пост-данным и удалить пробелы таким образом?
если тебе этот способ очень понравился, это не значит что так надо делать всем) не все такие умные и способные осилить рекурсию
лучше б посоветовал что php-код надо писать до вывода HTML))
 

magiq

Новичок
можно просто открыть любой движок и посмотреть как это там реализовано. Например dle
 

HraKK

Мудак
Команда форума
DLE не открывать. Там одни SQL Injection и маразм
 
Сверху