Пишем систему пользователей сайта на 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. Я эту систему делаю для игрового сервера чтоб можно было регистрировать пользователей через сайт а потом они заходили только, но тут проверка на занятость ника неидет =(

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

  4. Поправьте пожалуйста строчку 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 — дешифруй!

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

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

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

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

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

    ZmX

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

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

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

    -----

    не смеши...

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

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

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

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

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

  11. 2 Kalimdor:

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

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

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

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

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

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

  13. в строчке 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

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

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