Пишем систему пользователей сайта на PHP. Часть 2. Пишем регистрацию пользователей

Разглагольствовать что да как у меня сделано не буду, код очень хорошо прокомментрован буквально по действиям.

Сначала форма с полями:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<html>
  <head>
    <title>Регистрация нового пользователя</title>
  </head>
  <body>
    <table>
      <tr><td>
        <form action = "reg_end.php" method = "post">
          Введите, пожалуйста, желаемый логин:</td><td> <input type = "text" name = "login">
      </td></tr>
      <tr><td>
        Введите свой пароль<br /></td><td><input type = "password" name = "pass">
      </td></tr>
      <tr><td>
        Повторите свой пароль:</td><td><input type = "password" name = "second_pass">
      </td></tr>
      <tr><td>
        Введите свой e-mail:</td><td><input type = "text" name = "email">
      </td></tr>
      <tr><td>
        <input type = "submit" value = "Зарегистрироваться">
      </form>
      </td></tr>
    </table>
  </body>
</html>

В таблице юзеров у нас 4 поля — id_user, login, pass, mail. Пароли шифруются с помощью алгоритма необратимого шифрования md5. Теперь код самого обработчика:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php
  // Приём данных из формы
  $login = $_POST['login'];
  $pass = $_POST['pass'];
  $second_pass = $_POST['second_pass'];
  $email = $_POST['email'];
  // Проверка вводимых данных на корректность
  if(!preg_match("/^[A-Za-z0-9]+$/",$login))
    {
      include "regerror.php";// Здесь можно поставить адрес любой страницы с сообщением об ошибке. Аналогично со всеми инклюдами в проверке данных и их соответствии.
      exit();
    }
  if(!preg_match("/^[A-Za-z0-9]+$/",$pass))
    {
      include "regerror.php";
      exit();
    }
  if(!preg_match("/^[A-Za-z0-9]+$/",$second_pass))
    {
      include "regerror.php";
      exit();
    }
  if(!preg_match("/^[dw-_.]+@[dw-.]+.[w]{2,4}/i",$email))
    {
      include "regerror.php";
      exit();
    }
  // Проверяем соответствие пароля и его копии
  if (!$pass == $second_pass)
    {
      include "regerror.php";
      exit ();
    }
  // Проверим занятость логина и мыла в скрипте
  // Коннектимся к базе данных
  include "config.php";
  // Формируем запрос
  $query_login = "SELECT `user`,`mail` FROM `user` WHERE login = "$login" OR mail = "email";";
  // Делаем запрос к БД
  $ath = mysql_query ($query_login, $dbdeskriptor);
  // Проверяем успешность запроса
  if (!$ath)
    {
      include "dberror.php"; // При проверке успешности запроса указывайте свой адрес файла с сообщением об ошибке
      mysql_close ($dbdeskriptor);
      exit ();
    }
  // Извлекаем результаты запроса
  $result = mysql_fetch_assoc ($ath);
  // Проверяем свободность
  if (isset ($result ['user']))
    {
      include "regerror.php";
      mysql_close ($dbdeskriptor);
      exit ();
    }
  // Если всё нормально, заносим данные в базу данных
  // Сформируем данные
  $pass = md5 ($pass);
  // Сформируем запрос
  $query_insert = "INSERT INTO user VALUES (0,'$login','$pass','$email');";
  // Проведём запрос к БД
  $ath = mysql_query ($query_insert, $dbdeskriptor);
  // Проверим успешность запроса
  if (!$ath)
    {
      include "dberror.php";
      mysql_close ($dbdeskriptor);
      exit ();
    }
  // Закроем соединение с БД
  mysql_close ($dbdeskriptor);
  // Выведем сообщение об успешной регистрации
  echo "Регистрация прошла успешно";
?>

Файл подключения базы данных (config.php):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
  $dblocation = "localhost"; // Введите имя хоста сервера баз данных MySQL
  $dbuser = ""; // Введите имя вашего пользователя БД MySQL
  $dbpass = ""; // Ввелите пароль вашего пользователя БД MySQL
  $dbname = ""; // Введите имя БД MySQL, предназначенной для скрипта


// Соединение с БД
  $dbdeskriptor = @mysql_connect($dblocation,$dbuser,$dbpass);
  if (!$dbdeskriptor) // Проверяем соединение с сервером БД
    {
      include "dberror.php";
      exit();
    }
// Подключается к базе данных
  $db_select = mysql_select_db($dbname,$dbdeskriptor);
  if (!$db_select) // Проверяем соединение с нужной БД
    {
      include "dberror.php";
      exit();
    }
?>

Далее во всех скриптах, использующих БД для подключения будет использоваться этот файл.

На сегодня пока всё :) .

Метки: , , ,
Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

23 thoughts


  1. В обработчике форумы делай проверку на наличие данных из формы.

    Сделай у кнопки поле name и проверяй на приёме if (empty ($_POST['name'])) { данных нету }else{ пришли, проверяем }

    Прогонять логин и пароль по регуляркам не нужно, ну по крайней мере пароль.

    Он у тебя всёравно в md5 шифруется.

    Делать переходы на другие страницы смысла нет, не гибко это, лучше писать ошибки в массив и проверять в конце кол-во элементов в нём.

    Все include смени на require, где не нужно много включений — require_once. А то у тебя если будет отсуствовать включающийся файл, то будет каскад ошибок. Ну или проверяй каждый раз файл на существование, а потом уже include, но это проблемно.

    Все данные, которые приходят от юзеров, прогоняй через mysql_escape_string и trim хотябы, что выводится на странице — ещё и через htmlspecialchars.

    Уфф, в общем — двойка, переделать! :D

  2. > В обработчике форумы делай проверку на наличие данных из формы.

    Сделай у кнопки поле name и проверяй на приёме if (empty ($_POST['name'])) { данных нету }else{ пришли, проверяем }

    В регулярках написано так, чтобы хотя бы один символ да был. Это благодаря конструкции ^[\d\w]+$. Так что тут всё нормально.

    >Делать переходы на другие страницы смысла нет, не гибко это, лучше писать ошибки в массив и проверять в конце кол-во элементов в нём.

    Это действительно идея, спасибо :) .

    >Все include смени на require, где не нужно много включений — require_once. А то у тебя если будет отсуствовать включающийся файл, то будет каскад ошибок. Ну или проверяй каждый раз файл на существование, а потом уже include, но это проблемно.

    Вроде если всё есть, зачем проверять. Или же защита от дурака?

    >Все данные, которые приходят от юзеров, прогоняй через mysql_escape_string и trim хотябы, что выводится на странице — ещё и через htmlspecialchars.

    Ну у меня пока ничего не выводится. В логине только буквы и цыфры.

  3. Хм... А может задать полю id_user параметр auto_increment, пусть id назначается по порядку… Так удобнее будет.

    И строчку

    $query_insert = “INSERT INTO user VALUES (0,’$login’,'$pass’,'$email’);”;

    заменить на

    $query_insert = “INSERT INTO user (login,pass,mail) VALUES (’$login’,'$pass’,'$email’);”;

    А?

    А вообще большое спасибо за статью! =)

  4. Я эту систему делаю для игрового сервера чтоб можно было регистрировать пользователей через сайт а потом они заходили только, но тут проверка на занятость ника неидет =(

  5. Бугага!Автор убил нахрен:D Цитирую”Пароли шифруются с помощью алгоритма необратимого шифрования md5.” Какое нахрен необратимое шифрование???Уже давно есть ПО для расшифровки

  6. Поправьте пожалуйста строчку 38

    у Вас сейчас:

    $query_login = «SELECT `user`,`mail` FROM `user` WHERE login = «$login» OR mail = «email»;»;

    а надо:

    $query_login = «SELECT `user`,`mail` FROM `user` WHERE login = «$login» OR mail = «$email»;»;

    Для ZmX:

    62341b35f0a584c22f346b9c4c649281 — дешифруй!

  7. Вот что выдает, помогите разобраться...

    Parse error: syntax error, unexpected T_VARIABLE in /var/www/reg_end.php on line 38

    P.S. строки совпадают с вашими...

  8. Перед email поставить знак бакса, должно получиться mail = «$email». Видимо, когда блог переделывал, парсер что-то не то схавал(.

  9. >> Бугага!Автор убил нахрен:D Цитирую”Пароли шифруются с помощью алгоритма необратимого шифрования md5.” Какое нахрен необратимое шифрование???Уже давно есть ПО для расшифровки

    ZmX

    А это меня убило!!! Каким простите способом дешифруется?

    Если md5 построен не на шифрование все строки, а на шифрование, ОПРЕДЕЛЕННЫМ образом ОПРЕДЕЛЕННЫЕ символы строки!!!.. ?

  10. Бугага!Автор убил нахрен:D Цитирую”Пароли шифруются с помощью алгоритма необратимого шифрования md5.” Какое нахрен необратимое шифрование???Уже давно есть ПО для расшифровки

    -----

    не смеши...

  11. При проверке

    $query_login = «SELECT `user`,`mail` FROM `user` WHERE login = «$login» OR mail = «$email»;»;

    делал эхо $ath и он выдавал Resource id #6 вместо 0 или 1, т.е. не присваивалось ему булево значение... все проверил... все хорошо, в чем проблема незнаю. Убрал полностью проверку, в базе прописал уникальность имени и почты... при инсерте в базу он добавляется токо в случае уникальности... в случае дублирования скидывает на regerror то что и надо мне=) вроде все хорошо закончилось... но так и не понял, почему после инсерта переменная $ath принимает булевы значения а при селекте такая задница...

  12. Потому что при SELECT'е булево значение возвращается только при ошибке (то есть по любому FALSE). Иначе результатом mysql_query будет ресурс, содержащий выборку по Вашему SELECT'у. То есть, как Вы и указали, типом возвращаемого результата будет ресурс...

    А в случае INSERT'а результат будет хоть так, хоть эдак булев — вышло добавить или нет.

  13. З.Ы. Ах да, по поводу md5... Есть ресурсы, предлагающие ПОПРОБОВАТЬ по хэшу подобрать строку, которой этот хэш соответствует. Если такой хэш содержится в БД ресурса. Не факт, что это будет тот самый пароль, который выбрал юзер, но взломщику ведь большего и не надо?

    1. Если пароль не тот самый — то не подойдёт. Для каждой комбинации хеш свой получается. С другой стороны ни что не мешает сделать двойной хеш md5 или, скажем, сам хеш md5 зашифровать каким-то ещё методом шифрования или вообще накрутить много всяких штук, — в таком случае получится ещё надёжнее.

  14. 2 Kalimdor:

    Вы не правы... Длина хэша ограничена, следовательно — ограниченное количество значений. Очень большое, но ограниченное. Где-то в сети уже мелькал прикол по этому поводу: md5-хэш строки из более чем 200 символов был равен хэшу то ли 5-ти, то 6-символьной. А конструкция md5 (md5 (password)) отнюдь не увеличивает проблем взломщикам, доказывалось неоднократно.

    1. Где ты видел, чтобы кто-то использовал строку в 200 символов в пароле? В том диапазоне который обычно задаётся всё нормально. Понятно, что хеши можно подбирать по той же веерной таблице, только для того чтобы её построить понадобится очень много времени, причём чем больше алфавит, тем больше.

      > А конструкция md5 (md5 (password)) отнюдь не увеличивает проблем взломщикам, доказывалось неоднократно.

      Пруф? И мне кажется ты немного не понял идею. Я не предлагал усиливать конкретно способом md5 (md5 ($password)). Ничто не мешает придумать какой-нибудь свой способ шифрования, в который можно закатать хеш. Можно использовать уже готовые алгоритмы шифрования по ключу. Тут ограничивают только ресурсы и полёт фантазии.

  15. Никто не говорит о том, что эта строка была чьим-то паролем. Там ребята занимались именно тем, что искали разные строки с одинаковыми хэшами.

    > Я не предлагал усиливать конкретно способом md5 (md5 ($password)).

    > С другой стороны ни что не мешает сделать двойной хеш md5...

    А это как расценивать? Хотя, впрочем, отчего-то у меня складывается ощущение, что мы скатываемся куда-то в сторону банального троллинга.

    Для большинства сайтов с регистрацией md5 будет достаточно с головой — имхо. Мы же ведь не делаем зеркало БД ФБР? :-) Если ресурс не работает с серьезными деньгами или информацией приватного характера, то того уровня безопасности, который обеспечивается md5-шифрованием вполне достаточно.

  16. в строчке 38 $query_insert = “INSERT INTO user (login,pass,mail) VALUES (’$login’,'$pass’,'$email’);”;

    вот что выдает, уже все перепробовал, помогите плз

    Parse error: syntax error, unexpected T_STRING in C:\Documents and Settings\el blade\Рабочий стол\test php sait\reg_end.php on line 38

  17. 2 Никитос:

    Ты, умник, не умножай ООП без надобности. Ибо оно — всего лишь модный тренд, а PHP прекрасно себя чувствовал и безо всяких классов. Влазит тут всякое-разное, узнавшее о программировании полгода назад, и топырит пальцы со словечками, четко показывающими, кто он на самом деле. Я-то прекрасно знаю, что такое PHP Data Objects, а вот знаешь ли ты — как это: не CMS-ку настраивать, а писать сайт в блокноте, на 1-й версии, разбавляя код перловкой, ибо функционала PHP не хватало?

Напишите комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *