За последние 24 часа нас посетили 18168 программистов и 1700 роботов. Сейчас ищут 1697 программистов ...

Создал регистрацию прошу заценить.

Тема в разделе "PHP для новичков", создана пользователем AnteFil, 16 дек 2014.

  1. AnteFil

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

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    Написал страничку регистрации. Так как не богат опытом выслушаю любые замечания и передложения
    Код (PHP):
    1. <?php
    2.  
    3. ini_set('display_errors',1);
    4. define ( 'fatalerror', true );
    5. include_once ('../config.php');
    6.  
    7. //Заносим полученные данные о логине в переменную
    8. if (isset($_POST['g-recaptcha-response'])) { $grecaptcha = $_POST['g-recaptcha-response']; if ($grecaptcha == '') { unset($grecaptcha);} } //заносим введенный пользователем логин в переменную $login, если он пустой, то уничтожаем переменную
    9. if($_SERVER["REQUEST_METHOD"] == "POST")
    10. {
    11. if(!empty($grecaptcha))
    12. {
    13. $ip = $_SERVER['REMOTE_ADDR'];
    14. $homepage = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret=ключ&response='.$grecaptcha.'&remoteip='.$ip.'');
    15. $res = json_decode($homepage, true);
    16. //reCaptcha введена
    17. if($res['success'])
    18. {
    19. //Проверели капчу она введена по этому начинаем обрабатывать данные дальше
    20. if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} } //заносим введенный пользователем логин в переменную $login, если он пустой, то уничтожаем 
    21. if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} }
    22. if (isset($_POST['email'])) { $email = $_POST['email']; if ($email == '') { unset($email);} } //заносим введенный пользователем e-mail, если он пустой, то уничтожаем переменную
    23. //если пользователь не ввел логин или пароль, то выдаем ошибку и останавливаем скрипт
    24. if (empty($login) or empty($password)or empty($email))
    25. {
    26. exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!"); //останавливаем выполнение сценариев
    27. }
    28. //проверка е-mail адреса регулярными выражениями на корректность
    29. if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email))
    30. { exit ("Неверно введен е-mail!");}
    31. //добавляем проверку на длину логина и пароля
    32. if (strlen($login) < 3 or strlen($login) > 15) {
    33. exit ("Логин должен состоять не менее чем из 3 символов и не более чем из 15."); //останавливаем выполнение сценариев
    34. }
    35. if (strlen($password) < 3 or strlen($password) > 15) {
    36. exit ("Пароль должен состоять не менее чем из 3 символов и не более чем из 15."); //останавливаем выполнение сценариев
    37. }
    38.  
    39. $password = md5($password);//шифруем пароль
    40. $password = strrev($password);// для надежности добавим реверс
    41.  
    42. // проверка на существование пользователя с таким же E-mail
    43. $result = mysql_query("SELECT id FROM ru_user WHERE email='$email'",$db);
    44. $myrow_email = mysql_fetch_array($result);
    45. if (!empty($myrow_email['id'])) {
    46. exit ("Извините, введённый вами Email уже зарегистрирован. Введите другой адрес."); //останавливаем выполнение сценариев
    47. }
    48. // проверка на существование пользователя с таким же логином
    49. $result = mysql_query("SELECT id FROM ru_user WHERE login='$login'",$db);
    50. $myrow = mysql_fetch_array($result);
    51. if (!empty($myrow['id'])) {
    52. exit ("Извините, введённый вами логин уже зарегистрирован. Введите другой логин."); //останавливаем выполнение сценариев
    53. }
    54. // если такого нет, то сохраняем данные
    55. $result2 = mysql_query ("INSERT INTO `ru_user`(`email`, `login`, `password`) VALUES ('$email','$login','$password')",$db);
    56.  
    57. if ($result2=='TRUE')
    58. {
    59. $result3 = mysql_query ("SELECT id FROM ru_user WHERE login='$login'",$db);//извлекаем идентификатор пользователя. Благодаря ему у нас и будет уникальный код активации, ведь двух одинаковых идентификаторов быть не может.
    60. $myrow3 = mysql_fetch_array($result3);
    61. $activation = md5($myrow3['id']).md5($login);//код активации аккаунта. Зашифруем через функцию md5 идентификатор и логин. Такое сочетание пользователь вряд ли сможет подобрать вручную через адресную строку.
    62. $subject = "Подтверждение регистрации";//тема сообщения
    63. $message = "Здравствуйте! Спасибо за регистрацию на citename.ru\nВаш логин: ".$login."\n
    64. Перейдите по ссылке, чтобы активировать ваш аккаунт:\nhttp://localhost/test3/activation.php?login=".$login."&code=".$activation."\nС уважением,\n
    65. Администрация citename.ru";//содержание сообщение
    66. mail($email, $subject, $message, "Content-type:text/plane; Charset=utf-8\r\n");//отправляем сообщение
    67.     
    68. echo "Вам на E-mail выслано письмо с cсылкой, для подтверждения регистрации. Внимание! Ссылка действительна 1 час. <a href='index.php'>Главная страница</a>"; //говорим о отправленном письме пользователю
    69.  
    70.  
    71. } else { echo 'Зарегистрироваться не получилось';}
    72. }
    73. else
    74. {
    75. echo 'Нет капчи';
    76. }
    77. } else { echo 'Вы не ввели капчу'; }
    78. } else { echo 'Это не пост'; }
    79. ?>
    Если у кого то появились мысли что это всё фуфо то я ж учусь только километровые страницы кода мне пока не подвластны.
     
  2. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    такое мессиво без отступов даже смотреть не хочется. ты на пробелах экономишь?
     
  3. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    -зачем ограничивать так сильно размер пароля? может я хочу 20 символов. что плохого в этом?
    -реверс хеша пароля - не добавляет никакой надежности.
    -mysql_ расширение устарело. нельзя им пользоваться.
    - код лапша. учись разбивать на блоки. выделять в функции. повторное использование кода увеличивай.
    - форматирование кода ужастно. точнее его нет....
     
  4. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    Код (Text):
    1. $login = mysql_escape_string(stripslashes(htmlspecialchars($login)));
    тебе ведь уже говорили, что это чушь. ты или вообще не спрашивай чужое мнение или прислушивайся и анализируй.

    чтобы копировать поповщину много ума не надо, это не достижение.
     
  5. AnteFil

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

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    Код (Text):
    1. $login = mysql_escape_string(stripslashes(htmlspecialchars($login)));
    Это я оставил так как не понял минусов а дополнительная проверка лишней не будет
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Ну...теоретически...если будут не брутить, а по радуге раскатывать...стырив базу, но не получив доступ к коду и тайнам "шифрования"...в общем, где-то 0.00000000001% есть, что надежности прибавит, да.
    классика же)

    Добавлено спустя 1 минуту 22 секунды:
    Это ты оставил, так как не понял, что оно делает. Руководствуясь твоей логикой, можно вот так еще написать:

    $login = mysql_escape_string(stripslashes(htmlspecialchars(mysql_escape_string(stripslashes(htmlspecialchars($login))))));

    ну...на всякий, дополнительная проверка не лишняя.
     
  7. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    так ты пойми минусы этого решения. даже не минусы - а бредовость.
    пока не разберешься с этим, дальше даже нет смысла с тобой общаться. ибо если не можешь разобраться в таких простых трех функциях, то дальше уж точно не поймешь. непонимая основы - дальше двигаться несможешь.
     
  8. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    устарело, artoodetoo может обойти и даже mysql_real_escape_string в некоторых случаях =)
    чувак, ну ты сначала думай, потом делай. =)
     
  9. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    поддерживаю. так намного круче. попацански)
     
  10. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    base64 забыл. я встречал тут на форуме такой способ убрать опасные знаки бесовские
     
  11. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Ответь ка дружок всего на 1 вопрос, тебя не смущает этот "таран" в виде вложения
    Код (Text):
    1. if()
    2. {
    3.     if()
    4.     {
    5.         if()
    6.         {
    7.             // и т.д.
    8.         }
    9.     }
    10. }
     
  12. dapperkop

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

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Минус в том, что там никакой проверки нет. Ты сначала спецсимволы преобразуешь в хтмл-сущности (это нужно при выводе на страничку, чтобы не вставили, например, js-код), потом удаляешь экранирующие слеши (откуда им взяться, если не было addslashes?), потом экранируешь строку перед вставкой в запрос. О какой проверке ты говоришь?

    Добавлено спустя 1 минуту 3 секунды:
    Ты просто покоцал исходные данные и все...
     
  13. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Забыли про пробелы
    $login = mysql_escape_string(stripslashes(htmlspecialchars(mysql_escape_string(stripslashes(htmlspecialchars(trim($login)))))));
    и strip_tags()!
    $login = mysql_escape_string(stripslashes(htmlspecialchars(mysql_escape_string(stripslashes(htmlspecialchars(strip_tags(trim($login))))))));
    Проверка дополнительная то не лишняя будет. Только мы не проверяем, но не важно... .

    Если серьёзно, то если нужен ограниченный набор символов в логине, то в методе должна быть простая проверка по регулярке и больше ничего не нужно делать.
     
  14. AnteFil

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

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    с точки зрения надёжности надёжен ли данный код если оценивать от 0 до 100

    Добавлено спустя 19 секунд:
    Что я упустил и чего недописал
     
  15. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я уже сказал, что там дыра
     
  16. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    да ты толком ничего не написал. свалил всё в кучу и считаешь что готово. то что есть лишнее - ты не понимаешь. то что не хватает нужного - ты не понимаешь. опыта мало.
     
  17. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    лучше задай вопрос, правильный ли у тебя подход к написанию подобного..
     
  18. AnteFil

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

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    Хорошё что не так тут в основном понаписано что не стоит использовать mysql_escape_string, htmlspecialchars, stripslashes а всё остальное просто можно обьеденить в одну тему типа: "Ты не удачник и руки у тебя крЯвые" а по существу одна вода
     
  19. dapperkop

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

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Ну я хз, раз не видишь, что говорят по существу, тогда хз, что тебе ответить...

    Добавлено спустя 1 минуту 6 секунд:
    Нужно понимать зачем это делать, вот и все.
     
  20. rognorog

    rognorog Новичок

    С нами с:
    7 июл 2014
    Сообщения:
    330
    Симпатии:
    0
    Она работает вообще? :)
     
  21. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ну хер знает. сюда еще можно добавить изменение изображения, упаковку в архив, соединение по сокету. от этого ты не станешь правильно обрабатывать логин и пароль. критикуют тебя по делу. просто ты еще без опыта поэтому не понимаешь что именно ты не так сделал. ты просто накидал всё в кучу и считаешь работу выполненной. чтоб тебе жена так борщи готовила всю жизнь.
     
  22. AnteFil

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

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    Ну ни чё я не накидывал готов ответить за каждую строчку кроме mysql_escape_string так как я знаю что она экранирует спец символы и не более того

    Добавлено спустя 45 секунд:
    Во всём остальном я могу обьяснить всю логику
     
  23. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    вот. это взрослый разговор. объясни. а мы тебе поправим твои знания.
     
  24. dapperkop

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

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Это для экранирования строки перед вставкой в запрос (это необходимо и достаточно для экранирования, не нужно "слешить" строку - это не для этого).
    Это для того, чтобы при вставке в документ символы не были прочтены как "спецсимволы". Например, у тебя есть комментарии на странице. Кто-то пишет такой коммент:

    Код (PHP):
    1. <script type="text/javascript">
    2.     alert('ololo');
    3. </script>
    Как ты думаешь, что произойдет? Правильно, выскочит алерт. Чтобы этого не было, нужно спецсимволы, такие как: "<, " и т. д." Преобразовать в специальные коды ("<" станет "&lt;", " станет "&quot;"). Поэтому скрипт не сработает, а просто выведется как текст.

    Ну тут я вообще понятия не имею зачем нужна эта функция. Ну, то есть я понимаю что она делает, но вот где ее применить... Я не встречал такой надобности никогда.
     
  25. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    просто пиши с чистого листа снова с учетом ошибок.