За последние 24 часа нас посетили 17732 программиста и 1724 робота. Сейчас ищут 1052 программиста ...

Проверьте скрипт )

Тема в разделе "PHP для новичков", создана пользователем Invision, 22 фев 2011.

  1. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    вот написал минут за 20, вообще с нуля регистрацию первый раз сам делаю =) Какие недочеты итд итп. Я понимаю мб и говнокод, поправлю)


    PHP:
    1. <?php
    2.  
    3. if ($_POST) {
    4.  
    5. if (($_POST['login']!='') && ($_POST['password1']!='') &&  ($_POST['password2']!='') && ($_POST['email']!='')) { // Проверяем на заполнение
    6.  
    7. $login = trim($_POST['login']);
    8. $pass1 = trim($_POST['password1']);
    9. $pass2 = trim($_POST['password2']);
    10. $pass = md5($pass1);
    11. $ip=$_SERVER['REMOTE_ADDR'];
    12. $date = date("Y-m-d H:i:s");
    13. $email = trim($_POST['email']);
    14. $err = 0;
    15.  
    16. // Проверка на ошибки
    17.  
    18. $check_login01 = mysql_query("SELECT COUNT(*) FROM users WHERE login = '$login' OR email = '$email'"); // Проверка логина на занятость
    19. $check_login=mysql_result($check_login01, 0);
    20.  
    21. if($check_login > 0) { $err00 = "1"; $err = "1"; }
    22. if(strlen($login)<3) { $err01 = "1"; $err = "1"; }
    23. if(strlen($pass1)<6) { $err02 = "1"; $err = "1"; }
    24. if (strcmp($pass1, $pass2) !== 0) { $err03 = "1"; $err = "1";  }
    25. if(filter_var($email, FILTER_VALIDATE_EMAIL) == false) { $err04 = "1"; $err = "1"; }
    26.  
    27. // Конец проверки ошибок
    28.  
    29.  
    30. if ($err == "1") {
    31. echo "<div id=\"error\" style=\"width: 300px;\">
    32. <b>При регистрации произошли следующие ошибки</b><hr size=\"1\" color=\"#ccc\">
    33. ";
    34. if ($err00 == "1") { echo "- Такой логин или Email уже зарегистрирован.<br>"; }
    35. if ($err01 == "1") { echo "- Слишком короткий логин. Минимум 3 символа.<br>"; }
    36. if ($err02 == "1") { echo "- Слишком короткий пароль. Минимум 6 символов.<br>"; }
    37. if ($err03 == "1") { echo "- Пароли не совпадают.<br>"; }
    38. if ($err04 == "1") { echo "- Email введен некоректно."; }
    39. echo "</div>";
    40. } else {
    41.  
    42. mysql_query("INSERT INTO users (id_item, login, password, email, ip, date_reg) values ('','$login', '$pass', '$email', '$ip', '$date')");
    43.  
    44. }
    45.  
    46.  
    47. // Если не все поля заполнены...
    48. } else {
    49.  
    50. echo "<div id=\"error\" style=\"width: 230px;\"><b>Вам необходимо заполнить все поля!</b></div>";
    51.  
    52. }
    53.  
    54. }
    55. ?>
    HTML:
    1.  
    2. <div style="font-size:12px;">
    3. <form name="register" method="post" action="">
    4. <div>Логин:<br><input name="login" type="text" value="<?php if(isset($_POST['login'])) { echo $_POST['login']; } ?>" style="border:1px solid #ccc;"></div>
    5. <div>Пароль:<br><input name="password1" type="password" style="border:1px solid #ccc;"></div>
    6. <div>Повторите пароль:<br><input name="password2" type="password" style="border:1px solid #ccc;"></div>
    7. <div>Email:<br><input name="email" type="text" value="<?php if(isset($_POST['email'])) { echo $_POST['email']; } ?>" style="border:1px solid #ccc;"></div>
    8. <div><input type="submit" class="but" value="Создать аккаунт"></div>
    9. </form>
    10. </div>
     
  2. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
  3. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Да про SQL INJ я знаю, поправить можно так?

    PHP:
    1. 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]. Тогда нужно ограничить символы некоторые вида: ' % итп
     
  4. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    я лично оставляю [\-a-zA-Z0-9_\(\)\[\]] или [\-а-яА-Я0-9_\(\)\[\]] но запрещаю смешивать русские и английские символы в никнейме
     
  5. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Если честно - начинайте сразу использовать плейсхолдеры. mysqli или еще лучше PDO. Оно ничуть не сложнее в изучении/понимании чем mysql_query, зато будете выглядеть крутым чуваком ;)
     
  6. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Мне хотя бы это осилить, а потом уже дальше смотреть :D

    titch, можешь показать пример своего скрипта для запрета смешивания, пожалуйста.
     
  7. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    > Мне хотя бы это осилить, а потом уже дальше смотреть
    Уже осилили, смотрите дальше. Я серьезно.
    http://ru.php.net/manual/en/pdo.prepare.php
     
  8. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Хм, спасибо. В закладки добавил) А какие преимущества у этого pdo?
     
  9. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    PHP:
    1.  
    2. <?php
    3.     //check
    4.     //....
    5.     $name="ваваёжр";
    6.     if(!(preg_match("/^[_a-zA-Z0-9\-\(\)\[\]]+$/",$name) || preg_match("/^[_абвгдежзиклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ0-9\-\(\)\[\]]+$/",$name)))
    7.         exit("err");
    8.     echo "correct";
    9. ?>
    10.  
    Это делается от каличей и злоумышленников. А для того чтобы сделать людям хорошо - сделай еще проверку на js на клиентской стороне.
     
  10. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    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();
    Не сложно же?
     
  11. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Нет вроде) А для чего массив?:)
     
  12. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
  13. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Спасибо большое) Все во внимание беру.
    p.s по поводу кода есть еще кроме sql инъекций какие-нибудь сомнения?
     
  14. Апельсин

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

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    [​IMG]
     
  15. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Я вот так сделал, правильно?) Если работает то скорее всего да)

    PHP:
    1. if(!preg_match('/[^0-9A-Za-z_\[\]]/',$_POST['login'])) { echo "ok"; } else { echo "Error"; }
    p.s titch, твой вариант непроканал
     
  16. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    Я могу зарегаться в этой системе с логином в 255 символов?))) Представь, как будет выглядеть верстка этого сайта с таким логином.
    И, конечно, на ajax всё смотрелось бы вкуснее.
     
  17. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    Ага. Проверь [а-яА-Я] буквой р (русская эр). Думаю это несколько удивит.
    А на счёт не проканало... Не знаю) У меня всё канает.
     
  18. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    titch, в бд стоит лимит символов и я подправил при регистрации разрешено от 3 до 20 символов =)
     
  19. Апельсин

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

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    titch
    $text = 'аааааыыыыыррр';
    var_dump(preg_match('/^[а-я]+$/i', $text));
    int(1)


    $text = 'р';
    var_dump(preg_match('/^[а-я]+$/i', $text));
    int(1)

    и что я должен был увидеть?
     
  20. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Вообщем всем спасибо, дописал, поправил много недочетов. Работает как часы =)
     
  21. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    Сразу видно, кто уже мигрировал на UTF-8, а кто еще даже не думал) preg_match не работает с utf-8 полноценно. Пруф: http://webew.ru/posts/1836.webew
     
  22. Апельсин

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

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    та да. дофига ума надо чтоб "u" в регулярку поставить.

    жги есчо.
     
  23. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    я дибил) всем спасибо)
    Апельсин, прошу прощения, я был не прав.
     
  24. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Не ругайтесь на себя, titch :D