По форуму искала, ничего конкретного не нашла. Сама видела множество примеров, но в каждом были свои недочеты. Хочу с вашей помощью написать код удобной и безопасной регистрации пользователя на сайте, расписать все подробно и по шагам, чтобы потом тем, кто сталкнется с этим вопросом, помогла эта тема. Начнем. Регистрация. reg.php PHP: <?php $trules = '<form name="reg_rules" method="post" action="reg.php"> <textarea name="textarea" cols="30" rows="15"></textarea><br> <input type="hidden" name="step" value="2"> <input name="rules" type="submit" value="Я согласен"> <input name="rules" type="submit" value="Я не согласен"> </form>'; $tform = '<form name="reg_form" method="post" action="reg.php"> <input name="login" type="text" /> <input type="hidden" name="step" value="3"> <input type="submit" value="Зарегистрироваться" /> </form>'; $step = (int)$_POST['step']; if (isset($_POST['step'])){ switch ($step){ case '2':{ $rules = $_POST['rules']; if ($rules == "Я согласен") //На шаге 2 выводится форма, если пользователь согласен с правилами $centertext = $tform; else //Если не согласен $centertext = 'Регистрация невозможна без согласия с правилами сервера'; break; } case '3':{ $login = $_POST['login']; //На шаге 3 выводиться сообщение о результате проверки введенных в форму данных //тут проверка введенных данных //тут запись данных в базу $centertext = "Регистрация завершена"; break; } default:{ $centertext = ""; //По умолчанию выводится форма с правилами } } } if ($centertext == "") $centertext = $trules; echo $centertext; ?> Ну, вот что получилось. Мне кажется, что весь код регистрации должен находиться на одной странице. Жду советов по продолжению и улучшению кода. Сильно не ругайте, написала только то, в чем более-менее уверена, остальное не стала
PHP: $step = $_POST['step']; if (isset($step)){ Всегда true. Правильно: PHP: if (isset($_POST['step'])) {
Спасибо, исправила Буду сразу исправлять в первом посте, чтобы весь кусок был правильный в самом начале темы.
А тут два файла? с формой и без? Или это все в одом файле "reg.php"? Если все в одом файле, то думаю тэг action="" можно оставить пустым... И еще обрати внимание... когда я даже не заполнив форму нажимаю зарегистрироваться,то даже тогда пишется регистрация успешно завершена.. сделай так, чтобы при пустом значении этого поля заново выводилась форма с вводом логина...
Неправда. В $step будет null. а isset(null) === false Валерия добавьте в начало error_reporting(E_ALL|E_STRICT); и увидете ошибки
Точно. Но я бы всёравно, как-нибудь так, написал: PHP: if (isset($_POST['step'])) { $step = (int)$_POST['step'];
Один файл. Заголовок в посте просто не правильно написала, исправлю. Корректно ли оставлять значение action пустым ? Ну предложите, какие стоит добавить проверки.
по умолчанию, если action не указан, то берётся адрес той страницы, где указана форма, если не указан method, то используется GET. на то, что $_POST['login'] существует и не пустая, возможно на длину логина, на то, чтобы не было пвторений в базе, возможно, на длину, что бы был не короче n символов.
Проверка на пустое значение логина/пароля. Возможно просто поставить полю в БД not null, и обработать сообщение об ошибке. Проверка на уникальность логина. Опять же, можно просто поставить полю unique. Опционально: Проверка на минимальную длину/сложность пароля.
Сначало напиши на листке как что будет, чтобы легче было ориентироваться. например: - Вывести соглашение - Проверить согласен или нет - Если согласен, то вывести форму с регистрацией - После регистрации проверить заполнено ли поле "Логин" или нет - Если нет вывести форму заново и написать предупредение о заполнении всех полей - Если регистрация прошла успешна записать данны или в файл или в БД - Если не согласен с условиями соглашения то вывести сообщение о невозможности дальнейшей регистрации... СОгласие на услвие соглашения я бы сделал при помощи флажка checkbox или же радиокнопки: Код (Text): <input type=radio value=yes name=terms> Я согласен с условиями солашения <input type=radio value=no name=terms> Я отказываюсь от условий Дальше уже проверить: Код (Text): if (@$_POST['terms']=='yes') { форма с регистрацией } ну что-то в этом духе...
Исправила, добавила. У меня работает Что еще надо добавить для безопасности ? PHP: <?php $trules = '<form name="reg_rules" method="post" action="reg.php"> <textarea name="textarea" cols="30" rows="15"></textarea><br> <input type="hidden" name="step" value="2"> <input type="checkbox" name="rules"> Я обязуюсь выполнять правила сервера<br> <input type="submit" value="Продолжить"> </form>'; $tform = '<form name="reg_form" method="post" action="reg.php"> Логин: <input name="login" type="text" /><br> Пароль: <input name="pass" type="text" /><br> Повторите пароль:<input name="repass" type="text" /><br> E-mail:<input name="email" type="text" /><br> <input type="hidden" name="step" value="3"> <input type="submit" value="Зарегистрироваться" /> </form>'; $step = $_POST['step']; if (isset($_POST['step'])){ switch ($step){ case '2':{ $rules = $_POST['rules']; if ($rules == "on") //На шаге 2 выводится форма, если пользователь согласен с правилами $centertext = $tform; else //Если не согласен $centertext = 'Регистрация невозможна без согласия с правилами сервера'; break; } case '3':{ if ((isset($_POST['login']))AND(isset($_POST['pass']))AND(isset($_POST['repass']))AND(isset($_POST['email']))){ $login = $_POST['login']; $pass = $_POST['pass']; $repass = $_POST['repass']; $email = $_POST['email']; if(strlen($login) < 6) $centertext = "Минимальная длинна логина - 6 символов"; elseif(strlen($pass) < 8) $centertext = "Минимальная длинна пароля - 8 символов"; elseif($pass==$login) $centertext = "Не разрешено использовать одинаковые логин и пароль"; elseif($pass!=$repass) $centertext = "Введенные пароли не совпадают"; elseif(!preg_match("/^[A-Za-z0-9]{2,}$/",$login)) $centertext = "Логин содержит запрещенные символы."; 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)) $centertext = "Не правильный формат адреса электронной почты"; } else{ $centertext = "Не заполнены все обязательные поля."; } if ($centertext ==""){ $db = mysql_pconnect("localhost","root","root"); mysql_query("SET CHARACTER SET utf8"); mysql_select_db('l2jrt'); $result = mysql_query("SELECT login FROM `accounts` WHERE login='".$login."'"); if(mysql_num_rows($result)==0){ mysql_query("INSERT INTO `accounts`(login, password, email) VALUES ('$login', '$pass', '$email');") or die(mysql_error()); $centertext = "Добро пожаловать, $login. Аккаунт успешно создан."; } else{ $centertext = "К сожалению этот логин уже занят."; } } break; } default:{ $centertext = ""; } } } if ($centertext == "") $centertext = $trules; echo $centertext; ?> Подскажите, как вставить проверку, чтобы в пароле были любые символы кроме кириллицы ?
Можно добавить защиту от массовой регистрации... Вдруг кто-то захочет насолить и в автоматическом режиме сделает несколько тысяч регистраций?
Мне кажется что нужно проверять сразу на все ошибки и выводить их т.е. не PHP: <? ... if(strlen($login) < 6) $centertext = "Минимальная длинна логина - 6 символов"; elseif(strlen($pass) < 8) $centertext = "Минимальная длинна пароля - 8 символов"; ... ?> а PHP: <? ... if(strlen($login) < 6) $error[] = "Минимальная длинна логина - 6 символов"; if(strlen($pass) < 8) $error[] = "Минимальная длинна пароля - 8 символов"; ... ... $centertext = implode('<br/>', $error); ?>
Думаю, как раз мне нужно это сделать. Пароль НЕ ДОЛЖЕН содержать кириллицу. Но вполне может (на мой взгляд, даже обязан) - символы типа ^$). Есть варианты, как сделать такую проверку ? Отличная идея, спасибо, добавлю. Большое спасибо за ценную подсказку, буду очень благодарна за намек на реализацию
Намекну, а чё ж не намекнуть? Разрешаешь регистрацию на один e-mail не более одного пользователя. Отправляешь на этот e-mail ссылку с уникальным кодом, перейдя по которой, пользователь завершит регистрацию. Ну и пользователю сообщаешь, что мол: «Вы зарегистрированы. Для активации вашей регистрации перейдите по ссылке которую вам отправили на e-mail». «Время жизни» этой ссылки установи 2-3 дня. Маловероятно, что спамер заведет себе тысячи e-mail-ов чтобы насолить, хотя такую возможность тоже нельзя исключать, если у него есть свой домен... Если все же захочешь исключить и это маловероятное событие, то будем думать дальше. Ну и при применении этой защиты я бы посоветовал логику скрипта чуток переделать... А именно, до прохождения активации регистрации, не вносить запрет на регистрацию неактивированных логинов.
Штаны, спасибо, допишу код выложу - что получилось. Посоветуйте, с чего начать авторизацию. Не очень представляю, как оно работать должно
Нужно начать с генерации кода активации и построения ссылки. В код активации нужно включить буквы латинского алфавита обоих регистров в количестве от 6 штук. Можно и цифры. Генерировать символы активационного кода можно на основании случайных чисел.
Горбунов Олег зачем? это не капча, а произвольная последовательность которая будет идентифицировать созданную учетку в процессе ее активации.