За последние 24 часа нас посетили 17413 программистов и 1712 роботов. Сейчас ищут 1745 программистов ...

Регистрация и авторизация: правильный код

Тема в разделе "PHP для новичков", создана пользователем Валерия, 23 янв 2008.

  1. Валерия

    Валерия Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    50
    Симпатии:
    0
    По форуму искала, ничего конкретного не нашла. Сама видела множество примеров, но в каждом были свои недочеты. Хочу с вашей помощью написать код удобной и безопасной регистрации пользователя на сайте, расписать все подробно и по шагам, чтобы потом тем, кто сталкнется с этим вопросом, помогла эта тема.
    Начнем.
    Регистрация.
    reg.php
    PHP:
    1.  
    2. <?php
    3. $trules =
    4. '<form name="reg_rules" method="post" action="reg.php">
    5.     <textarea name="textarea" cols="30" rows="15"></textarea><br>
    6.     <input type="hidden" name="step" value="2">
    7.     <input name="rules" type="submit" value="Я согласен">
    8.     <input name="rules" type="submit" value="Я не согласен">
    9. </form>';
    10. $tform =
    11. '<form name="reg_form" method="post" action="reg.php">
    12.     <input name="login" type="text" />
    13.     <input type="hidden" name="step" value="3">
    14.     <input type="submit" value="Зарегистрироваться" />
    15. </form>';
    16.  
    17. $step = (int)$_POST['step'];
    18.  
    19. if (isset($_POST['step'])){
    20.     switch ($step){
    21.         case '2':{
    22.         $rules = $_POST['rules'];
    23.         if ($rules == "Я согласен")
    24.             //На шаге 2 выводится форма, если пользователь согласен с правилами
    25.             $centertext = $tform;
    26.         else
    27.             //Если не согласен
    28.             $centertext = 'Регистрация невозможна без согласия с правилами сервера';
    29.             break;
    30.         }
    31.         case '3':{
    32.             $login = $_POST['login'];
    33.             //На шаге 3 выводиться сообщение о результате проверки введенных в форму данных
    34.             //тут проверка введенных данных
    35.             //тут запись данных в базу
    36.             $centertext = "Регистрация завершена";
    37.             break;
    38.         }
    39.         default:{
    40.             $centertext = "";
    41.             //По умолчанию выводится форма с правилами
    42.         }
    43.     }
    44. }
    45. if ($centertext == "")
    46.     $centertext = $trules;
    47. echo $centertext;
    48. ?>
    49.  
    Ну, вот что получилось.
    Мне кажется, что весь код регистрации должен находиться на одной странице.
    Жду советов по продолжению и улучшению кода.
    Сильно не ругайте, написала только то, в чем более-менее уверена, остальное не стала :)
     
  2. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    PHP:
    1. $step = $_POST['step'];
    2.  
    3. if (isset($step)){
    Всегда true. Правильно:
    PHP:
    1. if (isset($_POST['step'])) {
     
  3. Валерия

    Валерия Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    50
    Симпатии:
    0
    Спасибо, исправила
    Буду сразу исправлять в первом посте, чтобы весь кусок был правильный в самом начале темы.
     
  4. Adil

    Adil Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    280
    Симпатии:
    0
    А тут два файла? с формой и без? Или это все в одом файле "reg.php"? Если все в одом файле, то думаю тэг action="" можно оставить пустым...

    И еще обрати внимание... когда я даже не заполнив форму нажимаю зарегистрироваться,то даже тогда пишется регистрация успешно завершена.. сделай так, чтобы при пустом значении этого поля заново выводилась форма с вводом логина...
     
  5. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    Неправда.
    В $step будет null.
    а isset(null) === false

    Валерия
    добавьте в начало error_reporting(E_ALL|E_STRICT); и увидете ошибки
     
  6. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    :)
    Точно. Но я бы всёравно, как-нибудь так, написал:
    PHP:
    1. if (isset($_POST['step'])) {
    2.     $step = (int)$_POST['step'];
     
  7. Валерия

    Валерия Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    50
    Симпатии:
    0
    Один файл. Заголовок в посте просто не правильно написала, исправлю. Корректно ли оставлять значение action пустым ?
    Ну предложите, какие стоит добавить проверки.
     
  8. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    по умолчанию, если action не указан, то берётся адрес той страницы, где указана форма, если не указан method, то используется GET.
    на то, что $_POST['login'] существует и не пустая, возможно на длину логина, на то, чтобы не было пвторений в базе, возможно, на длину, что бы был не короче n символов.
     
  9. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Проверка на пустое значение логина/пароля. Возможно просто поставить полю в БД not null, и обработать сообщение об ошибке.
    Проверка на уникальность логина. Опять же, можно просто поставить полю unique.

    Опционально:
    Проверка на минимальную длину/сложность пароля.
     
  10. Adil

    Adil Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    280
    Симпатии:
    0
    Сначало напиши на листке как что будет, чтобы легче было ориентироваться.
    например:
    - Вывести соглашение
    - Проверить согласен или нет
    - Если согласен, то вывести форму с регистрацией
    - После регистрации проверить заполнено ли поле "Логин" или нет
    - Если нет вывести форму заново и написать предупредение о заполнении всех полей
    - Если регистрация прошла успешна записать данны или в файл или в БД

    - Если не согласен с условиями соглашения то вывести сообщение о невозможности дальнейшей регистрации...


    СОгласие на услвие соглашения я бы сделал при помощи флажка checkbox или же радиокнопки:
    Код (Text):
    1.  
    2. <input type=radio value=yes  name=terms> Я согласен с условиями солашения
    3.  <input type=radio value=no  name=terms> Я отказываюсь от условий
    Дальше уже проверить:
    Код (Text):
    1. if (@$_POST['terms']=='yes')  {
    2. форма с регистрацией
    3. }
    ну что-то в этом духе...
     
  11. Валерия

    Валерия Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    50
    Симпатии:
    0
    Исправила, добавила. У меня работает :) Что еще надо добавить для безопасности ?
    PHP:
    1. <?php
    2.  $trules =
    3. '<form name="reg_rules" method="post" action="reg.php">
    4. <textarea name="textarea" cols="30" rows="15"></textarea><br>
    5. <input type="hidden" name="step" value="2">
    6. <input type="checkbox" name="rules"> Я обязуюсь выполнять правила сервера<br>
    7. <input type="submit" value="Продолжить">
    8. </form>';
    9.  $tform =
    10. '<form name="reg_form" method="post" action="reg.php">
    11. Логин: <input name="login" type="text" /><br>
    12. Пароль: <input name="pass" type="text" /><br>
    13. Повторите пароль:<input name="repass" type="text" /><br>
    14. E-mail:<input name="email" type="text" /><br>
    15. <input type="hidden" name="step" value="3">
    16. <input type="submit" value="Зарегистрироваться" />
    17. </form>';
    18.  
    19.  $step = $_POST['step'];
    20.  
    21.  if (isset($_POST['step'])){
    22.      switch ($step){
    23.          case '2':{
    24.          $rules = $_POST['rules'];
    25.          if ($rules == "on")
    26.              //На шаге 2 выводится форма, если пользователь согласен с правилами
    27.              $centertext = $tform;
    28.          else
    29.              //Если не согласен
    30.              $centertext = 'Регистрация невозможна без согласия с правилами сервера';
    31.              break;
    32.          }
    33.          case '3':{
    34.             if ((isset($_POST['login']))AND(isset($_POST['pass']))AND(isset($_POST['repass']))AND(isset($_POST['email']))){
    35.                 $login = $_POST['login'];
    36.                 $pass = $_POST['pass'];
    37.                 $repass = $_POST['repass'];
    38.                 $email = $_POST['email'];
    39.                
    40.                 if(strlen($login) < 6)
    41.                     $centertext  = "Минимальная длинна логина - 6 символов";
    42.                 elseif(strlen($pass) < 8)
    43.                     $centertext  = "Минимальная длинна пароля - 8 символов";
    44.                 elseif($pass==$login)
    45.                     $centertext  = "Не разрешено использовать одинаковые логин и пароль";
    46.                 elseif($pass!=$repass)
    47.                     $centertext  = "Введенные пароли не совпадают";
    48.                 elseif(!preg_match("/^[A-Za-z0-9]{2,}$/",$login))
    49.                     $centertext = "Логин содержит запрещенные символы.";
    50.                 elseif(!eregi("^[a-zA-Z0-9]+[_a-zA-Z0-9-]*(\.[_a-z0-9-]+)*@[a-z??????0-9]+(-[a-z??????0-9]+)*(\.[a-z??????0-9-]+)*(\.[a-z]{2,4})$", $email))
    51.                     $centertext = "Не правильный формат адреса электронной почты";
    52.                
    53.             }
    54.             else{
    55.                 $centertext = "Не заполнены все обязательные поля.";
    56.             }
    57.             if ($centertext ==""){
    58.                 $db = mysql_pconnect("localhost","root","root");
    59.                 mysql_query("SET CHARACTER SET utf8");
    60.                 mysql_select_db('l2jrt');
    61.                 $result = mysql_query("SELECT login FROM `accounts` WHERE login='".$login."'");
    62.                 if(mysql_num_rows($result)==0){
    63.                     mysql_query("INSERT INTO `accounts`(login, password, email) VALUES ('$login', '$pass', '$email');") or die(mysql_error());
    64.                     $centertext = "Добро пожаловать, $login. Аккаунт успешно создан.";
    65.                 }
    66.                 else{
    67.                     $centertext = "К сожалению этот логин уже занят.";
    68.                 }
    69.             }
    70.             break;
    71.          }
    72.          default:{
    73.              $centertext = "";
    74.          }
    75.      }
    76.  }
    77.  if ($centertext == "")
    78.      $centertext = $trules;
    79.  echo $centertext;
    80.  ?>
    Подскажите, как вставить проверку, чтобы в пароле были любые символы кроме кириллицы ?
     
  12. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Этого не нужно делать тебе.
     
  13. Штаны

    Штаны Guest

    Если есть Алёшка у неё? :)
     
  14. Штаны

    Штаны Guest

    Можно добавить защиту от массовой регистрации... Вдруг кто-то захочет насолить и в автоматическом режиме сделает несколько тысяч регистраций? :)
     
  15. Вльдемар

    Вльдемар Активный пользователь

    С нами с:
    20 май 2006
    Сообщения:
    635
    Симпатии:
    0
    Адрес:
    Белхород
    Мне кажется что нужно проверять сразу на все ошибки и выводить их
    т.е. не
    PHP:
    1. <?
    2. ...
    3.  
    4. if(strlen($login) < 6)
    5. $centertext  = "Минимальная длинна логина - 6 символов";
    6. elseif(strlen($pass) < 8)
    7. $centertext  = "Минимальная длинна пароля - 8 символов";
    8. ...
    9. ?>
    а

    PHP:
    1. <?
    2. ...
    3.  
    4. if(strlen($login) < 6)
    5. $error[]  = "Минимальная длинна логина - 6 символов";
    6. if(strlen($pass) < 8)
    7. $error[]  = "Минимальная длинна пароля - 8 символов";
    8. ...
    9. ...
    10. $centertext  = implode('<br/>', $error);
    11. ?>
     
  16. Валерия

    Валерия Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    50
    Симпатии:
    0
    Думаю, как раз мне нужно это сделать. Пароль НЕ ДОЛЖЕН содержать кириллицу. Но вполне может (на мой взгляд, даже обязан) - символы типа ^$). Есть варианты, как сделать такую проверку ?

    Отличная идея, спасибо, добавлю.

    Большое спасибо за ценную подсказку, буду очень благодарна за намек на реализацию ;)
     
  17. Штаны

    Штаны Guest

    Намекну, а чё ж не намекнуть? :) Разрешаешь регистрацию на один e-mail не более одного пользователя. Отправляешь на этот e-mail ссылку с уникальным кодом, перейдя по которой, пользователь завершит регистрацию. Ну и пользователю сообщаешь, что мол: «Вы зарегистрированы. Для активации вашей регистрации перейдите по ссылке которую вам отправили на e-mail». «Время жизни» этой ссылки установи 2-3 дня. Маловероятно, что спамер заведет себе тысячи e-mail-ов чтобы насолить, хотя такую возможность тоже нельзя исключать, если у него есть свой домен... Если все же захочешь исключить и это маловероятное событие, то будем думать дальше. Ну и при применении этой защиты я бы посоветовал логику скрипта чуток переделать... А именно, до прохождения активации регистрации, не вносить запрет на регистрацию неактивированных логинов.
     
  18. Валерия

    Валерия Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    50
    Симпатии:
    0
    Штаны, спасибо, допишу код выложу - что получилось.
    Посоветуйте, с чего начать авторизацию. Не очень представляю, как оно работать должно :(
     
  19. Штаны

    Штаны Guest

    Нужно начать с генерации кода активации и построения ссылки. В код активации нужно включить буквы латинского алфавита обоих регистров в количестве от 6 штук. Можно и цифры. Генерировать символы активационного кода можно на основании случайных чисел.
     
  20. Anonymous

    Anonymous Guest

    Исключив 0, O, I, l, 1, 5, s, B
     
  21. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Горбунов Олег зачем? это не капча, а произвольная последовательность которая будет идентифицировать созданную учетку в процессе ее активации.
     
  22. Anonymous

    Anonymous Guest

    Вполне вероятно. Каптча должна быть.
     
  23. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а может и нет ))
     
  24. Вльдемар

    Вльдемар Активный пользователь

    С нами с:
    20 май 2006
    Сообщения:
    635
    Симпатии:
    0
    Адрес:
    Белхород
    Боты умеют и по почте подтверждать
     
  25. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Вльдемар у нас тут с ГО тред по поводу того что он хочет из ссылки исключить похожие символы