вот написал минут за 20, вообще с нуля регистрацию первый раз сам делаю =) Какие недочеты итд итп. Я понимаю мб и говнокод, поправлю) PHP: <?php if ($_POST) { if (($_POST['login']!='') && ($_POST['password1']!='') && ($_POST['password2']!='') && ($_POST['email']!='')) { // Проверяем на заполнение $login = trim($_POST['login']); $pass1 = trim($_POST['password1']); $pass2 = trim($_POST['password2']); $pass = md5($pass1); $ip=$_SERVER['REMOTE_ADDR']; $date = date("Y-m-d H:i:s"); $email = trim($_POST['email']); $err = 0; // Проверка на ошибки $check_login01 = mysql_query("SELECT COUNT(*) FROM users WHERE login = '$login' OR email = '$email'"); // Проверка логина на занятость $check_login=mysql_result($check_login01, 0); if($check_login > 0) { $err00 = "1"; $err = "1"; } if(strlen($login)<3) { $err01 = "1"; $err = "1"; } if(strlen($pass1)<6) { $err02 = "1"; $err = "1"; } if (strcmp($pass1, $pass2) !== 0) { $err03 = "1"; $err = "1"; } if(filter_var($email, FILTER_VALIDATE_EMAIL) == false) { $err04 = "1"; $err = "1"; } // Конец проверки ошибок if ($err == "1") { echo "<div id=\"error\" style=\"width: 300px;\"> <b>При регистрации произошли следующие ошибки</b><hr size=\"1\" color=\"#ccc\"> "; if ($err00 == "1") { echo "- Такой логин или Email уже зарегистрирован.<br>"; } if ($err01 == "1") { echo "- Слишком короткий логин. Минимум 3 символа.<br>"; } if ($err02 == "1") { echo "- Слишком короткий пароль. Минимум 6 символов.<br>"; } if ($err03 == "1") { echo "- Пароли не совпадают.<br>"; } if ($err04 == "1") { echo "- Email введен некоректно."; } echo "</div>"; } else { mysql_query("INSERT INTO users (id_item, login, password, email, ip, date_reg) values ('','$login', '$pass', '$email', '$ip', '$date')"); } // Если не все поля заполнены... } else { echo "<div id=\"error\" style=\"width: 230px;\"><b>Вам необходимо заполнить все поля!</b></div>"; } } ?> HTML: <div style="font-size:12px;"> <form name="register" method="post" action=""> <div>Логин:<br><input name="login" type="text" value="<?php if(isset($_POST['login'])) { echo $_POST['login']; } ?>" style="border:1px solid #ccc;"></div> <div>Пароль:<br><input name="password1" type="password" style="border:1px solid #ccc;"></div> <div>Повторите пароль:<br><input name="password2" type="password" style="border:1px solid #ccc;"></div> <div>Email:<br><input name="email" type="text" value="<?php if(isset($_POST['email'])) { echo $_POST['email']; } ?>" style="border:1px solid #ccc;"></div> <div><input type="submit" class="but" value="Создать аккаунт"></div> </form> </div>
Да про SQL INJ я знаю, поправить можно так? PHP: mysql_query("INSERT INTO users (id_item, login, password, email, ip, date_reg) values ('','".mysql_real_escape_string($login)."', '".mysql_real_escape_string($pass)."', '".mysql_real_escape_string($email)."', '$ip', '$date')"); Вообще разрешить бы логин и пароль A-Z0-9, но ведь бывают логины вида: Name[rus]. Тогда нужно ограничить символы некоторые вида: ' % итп
я лично оставляю [\-a-zA-Z0-9_\(\)\[\]] или [\-а-яА-Я0-9_\(\)\[\]] но запрещаю смешивать русские и английские символы в никнейме
Если честно - начинайте сразу использовать плейсхолдеры. mysqli или еще лучше PDO. Оно ничуть не сложнее в изучении/понимании чем mysql_query, зато будете выглядеть крутым чуваком
Мне хотя бы это осилить, а потом уже дальше смотреть titch, можешь показать пример своего скрипта для запрета смешивания, пожалуйста.
> Мне хотя бы это осилить, а потом уже дальше смотреть Уже осилили, смотрите дальше. Я серьезно. http://ru.php.net/manual/en/pdo.prepare.php
PHP: <?php //check //.... $name="ваваёжр"; if(!(preg_match("/^[_a-zA-Z0-9\-\(\)\[\]]+$/",$name) || preg_match("/^[_абвгдежзиклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ0-9\-\(\)\[\]]+$/",$name))) exit("err"); echo "correct"; ?> Это делается от каличей и злоумышленников. А для того чтобы сделать людям хорошо - сделай еще проверку на js на клиентской стороне.
PDO было создано для объединения многочисленных расширений для разных баз данных. У всех немного разный синтаксис и принципы работы. А PDO дает единый набор инструкций (единый интерфейс), который можно запомнить и использовать вне зависимости от того, какая база данных используется: mysql, postgresql, mssql и т.д. Ну и наличие плейсхолдеров, причем с возможностью типизации. Т.е. в твоем случае $st = $dbh->prepare("SELECT COUNT(*) FROM users WHERE login = :login OR email = :email"); $st->execute(array(":login" => $login, ":email" => $email)); $check_login = $st->fetchColumn(); Не сложно же?
Спасибо большое) Все во внимание беру. p.s по поводу кода есть еще кроме sql инъекций какие-нибудь сомнения?
Я вот так сделал, правильно?) Если работает то скорее всего да) PHP: if(!preg_match('/[^0-9A-Za-z_\[\]]/',$_POST['login'])) { echo "ok"; } else { echo "Error"; } p.s titch, твой вариант непроканал
Я могу зарегаться в этой системе с логином в 255 символов?))) Представь, как будет выглядеть верстка этого сайта с таким логином. И, конечно, на ajax всё смотрелось бы вкуснее.
Ага. Проверь [а-яА-Я] буквой р (русская эр). Думаю это несколько удивит. А на счёт не проканало... Не знаю) У меня всё канает.
titch $text = 'аааааыыыыыррр'; var_dump(preg_match('/^[а-я]+$/i', $text)); int(1) $text = 'р'; var_dump(preg_match('/^[а-я]+$/i', $text)); int(1) и что я должен был увидеть?
Сразу видно, кто уже мигрировал на UTF-8, а кто еще даже не думал) preg_match не работает с utf-8 полноценно. Пруф: http://webew.ru/posts/1836.webew