За последние 24 часа нас посетил 17571 программист и 1718 роботов. Сейчас ищут 1703 программиста ...

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

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

  1. Anonymous

    Anonymous Guest

    Ошибся. Я про капчу думал.
     
  2. Штаны

    Штаны Guest

    Для этого нужно иметь эти тысячи адресов e-mail. На бесплатном почтовом сервере с заведением себе тысяч аккаунтов вряд-ли кто свяжется... На своем домене, но стороннем хостинге - тоже, потому как хостеры хоть и декларируют неограниченное количество адресов почты, но если поступит жалоба, что они использовались для спама, спамеру закроют аккаунт и деньги не вернут... Если у спамера свой сервер, тогда он конечно может без особых проблем гадить. Но от этого тоже можно защититься.
     
  3. Штаны

    Штаны Guest

    Валерия, плюс при вводе в действия ссылки активации, нужно чтобы твой сервер не обвинили в спаме... Если спамер создаст тысячи регистраций и твой сервер всем им разошлет активационные ссылки этим он уже навредит работе твоему сайту...
     
  4. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Прости, но с какого ты решила, что кирилица в пароле это адское зло? В пароле должны быть любые символы. Если ты хранишь пароли в БД и имеешь проблему с кодировкой при сравнивании (при авторизации пользователя), то это твои проблемы, которые всё равно должны быть решены, ибо если так, то на выходе у тебя и в новостях (etc.) будет проблема с кодировкой.

    Вот единственное оправдание, которое я смог найти для отрицания кирилицы в пароле - кодировка. Всё. Какая тебе-то разница что за символы ввёл пользователь для обеспечения безопасности своего аккаунта?

    Валерия, не тупи, не надо вырезать никакие символы из пароля.
     
  5. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Тем более в БД не будет самого пароля, будет только его хем-сумма. а строка от которой ты берешь хеш может быть любой
     
  6. Anonymous

    Anonymous Guest

    Для этого не обязательно иметь хостинг. Это может быть один из компьютеров в ботнете, например. Да и просто домашний комп с динамическим IP.
    Даже если - при цене 3$ за хостинг в месяц можно купить десяток хостингов на месяц, и разослать немеряно писем. Это вполне реальная, осознанная угроза.
     
  7. Штаны

    Штаны Guest

    Согласен :) Целиком и полностью :)
    А я считаю, что все таки кириллицу не стоит включать в пароль. Например, если человек зарегистрировался, а потом выехал за границу, то там он может кириллицу так быстро и не найти... Плюс на некоторых коммуникатрах (если человек хочет с мобилы зайти) - кириллица в пароле недопустима... А могут еще быть и с браузерами нюансы, они могут кириллицу при передаче конвертировать...
     
  8. Валерия

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

    С нами с:
    14 ноя 2007
    Сообщения:
    50
    Симпатии:
    0
    Я и не собиралась тупить, мне лишние заморочки ни к чему, я бы с удовольствием оставила все как есть, пусть хоть арабскими пишут, хоть иероглифами, НО (! вот имеено из-за этого НО и начинаются все заморочки) я делаю не просто сайт ради сайта, а сайт (если кто вдруг не заметил мой аватар) для некоторой онлайн-игры, и регистрация на сайте - это регистрация игрового аккаунта. А игровой клиент просто-напросто не поддерживает ввод кириллицы в окне логин/пасс.
    Так что - все-таки прийдется проверку добавить )
     
  9. DarkElf

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

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    ориентируясь на тот код, который приведен в посте от Добавлено: Ср Янв 23, 2008 9:04 pm

    1) строки 19 и 21 удалить и заменить на $step = isset($_POST['step']) ? intval($_POST['step']) : false; строку 76 удалить.

    2) в блоках case заменить '2' на 2 и т.п., иначе зачем приводить что-то к int - типу, если сравнение все равно идет по стрингу?

    3) в порядке ИМХО, или обрамлять все if-ы фигурными скобками, или менять на $centertext = ($rules == 'on') ? $tform : 'Регистрация невозможна без согласия с правилами сервера';

    4) в сравнениях и вообще в строках применение "" оправданно только если нужно применять инструкции типа "В корзине $cnt товаров", в остальных случаях рулят апострофы, так как в двойных кавычках пых пытается найти свои переменные, все, что в апострофах, сразу летит в вывод

    5) если в строке 48 фрагмент {2,} заменить на {6,} то строки 40 и 41 не понадобятся

    6) а что выведется в сообщении, если пароль равен логину, длина логина 6 символов?

    7) зачем использовать pconnect к серверу? судя по имени базы l2jrt - это база ява-сервера линейки, так его коннект все равно использовать не получится:)

    8) имхо, проверки в строках 61 и 62 лучше все таки заменить на уникальный индекс в таблице. кстати, это еще и ускорит отработку всех запросов, где идет ограничение или объединение по никнейму. на сколько мне известно, в яве их - весьма и весьма много.

    9) имхо, если проверка в строке 77 - только из-за того, что в строке 73 $centertext оставляется пустой, то лучше строку 73 заменить на строку 78, а 77 - удалить за ненадобностью:)
     
  10. DarkElf

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

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    lexa

    в данном конкретном случае кириллица в пароле - зло. клиенты lineage Уже очень давно тупо не дают вводить в поле пароль кириллические символы.
     
  11. Валерия

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

    С нами с:
    14 ноя 2007
    Сообщения:
    50
    Симпатии:
    0
    А делать-то что ? :)
     
  12. Валерия

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

    С нами с:
    14 ноя 2007
    Сообщения:
    50
    Симпатии:
    0
    DarkElf
    Кое-что поправила, по вашим советам, большое за них спасибо :) Кое-что трогать не стала. Вот что имеем на данный момент:
    PHP:
    1.  
    2. <?php
    3. $title = $conf['sitename']." - Создание аккаунта";
    4. $ptitle = "Регистрация";
    5.  
    6.  $trules =
    7. '<form name="reg_rules" method="post" action="?p=register">
    8. <div class="qu">Регистрируя аккаунт на нашем сервере, вы автоматически соглашаетесь с правилами нашего сервера. <br>
    9. Главное правило сервера - админ всегда прав.<br>
    10. Остальные правила вы можете почитать тут: <a href="?p=rules">Правила сервера</a>.
    11. Приятной игры !!!</div><br>
    12. <input type="hidden" name="step" value="2">
    13. <center>
    14. <input type="checkbox" name="rules"> Я обязуюсь выполнять правила сервера<br>
    15. <input type="submit" value="Продолжить" class="but">
    16. </center>
    17. </form>';
    18.  $tform =
    19. '<form name="reg_form" method="post" action="?p=register">
    20. <table width=100% border="0" cellpadding="2" cellspacing="">
    21. <tr><td align=right valign="top">Логин:</td>
    22. <td valign="top"><input name="login" type="text" class="inp">
    23. <br>
    24. <font color = #b40404 size=-2>Только латинские буквы и цифры.<br>
    25. Минимум 6 символов.
    26. </font>
    27. </td></tr>
    28.  
    29. <tr><td align=right valign="top">Пароль:
    30. </td><td valign="top"><input name="pass" type="text" class="inp">
    31. <br>
    32. <font color = #b40404 size=-2>Только латинские буквы и символы.<br>
    33. Минимум 8 символов.
    34. </font>
    35. </td></tr>
    36.  
    37. <tr><td align=right valign="top">Повторите пароль:
    38. </td><td valign="top"><input name="repass" type="text" class="inp">
    39. <br>
    40. <font color = #b40404 size=-2>Введите пароль еще раз.
    41. </font>
    42. </td></tr>
    43.  
    44. <tr><td align=right valign="top">E-mail:
    45. </td><td valign="top"><input name="email" type="text" class="inp">
    46. <br>
    47. <font color = #b40404 size=-2>Вводите реально существующий адрес.<br>
    48. Он может понадобиться вам<br>для восстановления пароля.
    49. </font>
    50. </td></tr>
    51.  
    52. <tr><td align=right valign="top">Секретный вопрос:
    53. </td><td valign="top"><input name="ques" type="text" class="inp">
    54. <br>
    55. <font color = #b40404 size=-2>Требуется для восстановления пароля.<br>Запомните его.
    56. </font>
    57. </td></tr>
    58.  
    59. <tr><td align=right valign="top">Секретный ответ:
    60. </td><td valign="top"><input name="answ" type="text" class="inp">
    61. <br>
    62. <font color = #b40404 size=-2>Требуется для восстановления пароля.<br>Запомните его.
    63. </font>
    64. </td></tr>
    65.  
    66. <tr><td align=right valign="top">Реферал:
    67. </td><td><input name="ref" type="text" class="inp">
    68. <br>
    69. <font color = #b40404 size=-2>Ник чара человека, благодаря которому<br>вы начали играть на нашем сервере.<br>Чем больше человек при регистрации<br>укажут вас в качестве реферала, тем<br>больший приз вы получите.
    70. </font>
    71. </td></tr>
    72.  
    73. <tr><td></td><td><input type="submit" value="Продолжить" class="but"></td></tr>
    74. </table>
    75. <input type="hidden" name="step" value="3">
    76. </form>';
    77.  
    78. $step = isset($_POST['step']) ? intval($_POST['step']) : false;  
    79.     switch ($step){
    80.         case 2:{
    81.             $rules = $_POST['rules'];
    82.             $centertext = ($rules == 'on') ? $tform : 'Регистрация невозможна без согласия с правилами сервера';
    83.             break;
    84.         }
    85.         case 3:{
    86.             if ((isset($_POST['login']))AND(isset($_POST['pass']))AND(isset($_POST['repass']))AND(isset($_POST['email']))){
    87.                 $login = $_POST['login'];
    88.                 $pass = $_POST['pass'];
    89.                 $repass = $_POST['repass'];
    90.                 $ques = $_POST['ques'];
    91.                 $answ = $_POST['answ'];
    92.                 $ref = $_POST['ref'];
    93.                
    94.                 if(strlen($login) < 6)
    95.                     $err[]  = 'Минимальная длинна логина - 6 символов';
    96.                 if(strlen($pass) < 8)
    97.                     $err[]  = 'Минимальная длинна пароля - 8 символов';
    98.                 if($pass==$login)
    99.                     $err[]  = 'Не разрешено использовать одинаковые логин и пароль';
    100.                 if($pass!=$repass)
    101.                     $err[]  = 'Введенные пароли не совпадают';
    102.                 if(!preg_match("/^[A-Za-z0-9]{6,}$/",$login))
    103.                     $err[] = 'Логин содержит запрещенные символы.';
    104.                 if(!eregi("^[a-zA-Z0-9]+[_a-zA-Z0-9-]*(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,4})$", $email))
    105.                     $err[] = 'Не правильный формат адреса электронной почты';
    106.                 if(strlen($ques) < 20)
    107.                     $err[] = 'Слишком короткий секретный вопрос';
    108.                 if(strlen($answ) < 20)
    109.                     $err[] = 'Слишком короткий секретный ответ';
    110.                 if(!preg_match("/^[A-Za-z0-9]{6,}$/",$ref))
    111.                     $err[] = 'Не правильный ник реферала.'; 
    112.                    
    113.                 if ($err!='')
    114.                     $centertext  = implode('<br/>', $err);
    115.             }
    116.             else{
    117.                 $centertext = 'Не заполнены все обязательные поля.';
    118.             }
    119.             if ($centertext ==''){
    120.                 $db = mysql_connect('localhost','root','root');
    121.                 mysql_query('SET CHARACTER SET utf8');
    122.                 mysql_select_db('baza');
    123.                 $result = mysql_query("SELECT login FROM `accounts` WHERE login='$login'");
    124.                 if(mysql_num_rows($result)==0){
    125.                     $ques = mysql_real_escape_string($ques);
    126.                     $answ = mysql_real_escape_string($answ);
    127.                     mysql_query("INSERT INTO `accounts`(login, password, email) VALUES ('$login', '$pass', '$email');") or die(mysql_error());
    128.                     $centertext = "Добро пожаловать, $login. Аккаунт успешно создан.";
    129.                 }
    130.                 else{
    131.                     $centertext = 'К сожалению этот логин уже занят.';
    132.                 }
    133.             }
    134.             break;
    135.          }
    136.          default:{
    137.              $centertext = "";
    138.          }
    139.      }
    140.  
    141.  if ($centertext == '')
    142.      $centertext = $trules;
    143.  ?>
    144.  
    В запросе не хватает полей, пока так надо, когда буду ставить на сервер - буду править, сейчас дома стоит, базы нет )
    Строки 124 и 125 - этого хватит для защиты ?
    Как можно делать поиск по ИД, если надо проверить логин ? Или я чего-то не понимаю ?...
     
  13. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    :oops: :roll:

    Код (Text):
    1. if (preg_match('/[а-я]/i', $pass))
    2.     $err[]  = 'Пароль не может содержать кирилицу';
     
  14. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Зачем создавать массив, когда можно конкатенировать ошибки к одной переменной?

    Валерия
    Неужели Вы изучили php ради lineage?
     
  15. Валерия

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

    С нами с:
    14 ноя 2007
    Сообщения:
    50
    Симпатии:
    0
    Да я его и не изучала :) Просто делаю сайт себе. Я паскаль хорошо знаю и С++, так что особых проблем не увидела.

    Помогите вот с этим:
    PHP:
    1. <?php
    2. ...
    3. if(!eregi("^[a-zA-Z0-9]+[_a-zA-Z0-9-]*(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,4})$", $email))
    4.     $err[] = 'Не правильный формат адреса электронной почты';
    5.  
    6. ...
    7. ?>
    на домашнем компе норм все, на сервере ни 1 мыла не пропускает... С регулярными выражениями у меня напряженка :) Сама не могу разобраться.

    Спасибо.
     
  16. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    копать в сторону локали
     
  17. DarkElf

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

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    Валерия

    мм, с каким-то из С4 серверов шел комплект php - скриптов для сайта.. но с4 я давно удалил.
    что мешает сделать авторегистрацию аккаунтов?:)
     
  18. Anonymous

    Anonymous Guest

    DarkElf,
     
  19. Валерия

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

    С нами с:
    14 ноя 2007
    Сообщения:
    50
    Симпатии:
    0
    :)
    DarkElf,
    Ничего не мешало поставить авторегу, так же ничего не мешало скачать любую веб-обвязку, их мона найти десятки, от очень приличных, до совсем страшных :) Однако, только качая и пользуя чужое, ни к чему хорошему не прийдешь :)
     
  20. Anonymous

    Anonymous Guest

    Вах
     
  21. DarkElf

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

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    Валерия

    только стоит соизмерять свои потребности и возможности:)
     
  22. RomanBush

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

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    http://phpclub.ru/detail/article/regexp_1
    Лучшая статья из всего, что я видел по регулярным выражениям. Разжёвано - дальше некуда. Остаётся только проглотить и переварить.
     
  23. Валерия

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

    С нами с:
    14 ноя 2007
    Сообщения:
    50
    Симпатии:
    0
    Вполне соизмеряю :) Сегодня-завтра запускаю :)

    Может кто-нить все-таки поможет проверку е-майла поправить ?)
     
  24. SelaX

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

    С нами с:
    23 янв 2008
    Сообщения:
    19
    Симпатии:
    0
    Уже есть сайт, где есть веб-обвязки http://moy-web.ru
     
  25. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Тогда попробуй копнуть в сторону setlocale(). Вероятно, на хостинге, в отличии от локального сервера, по усолчанию стоит не кирилическая кодировка.
    Код (Text):
    1. setlocale(LC_ALL, 'ru_RU.cp1251', 'ru_RU.CP1251'); // методом перебора
    Самая большая проблема заключается в имени локали. Нет стандарта имени и каждый хостер может по-своему её называть. Например, на каком-то из хостингов за cp1251 выдавали koi8-r, не со зла, а как замену. :(
    Поэтому лучше спроси хостера как-то так:
    Возможно, ты можешь найти этот ответ и в факе хостера.