Jump to content
  • 0

Форма регистрации и авторизации


BlooDSikeR
 Share

Question

День добрый, ребяята)
Около месяца изучаю по чу-чуть php, в свободное на работе время. Вот за два дня сделал такую форму регистрации и авторизации 
http://zyy.zz.mu

Реализовано:
1)Проверка на занятость логина
2)Проверка при регистрации, совпадает ли первый и второй введенные пароли

3)Если логин меньши или равно 3 знакам, выдает уведомление, что логин должен быть больше 3х знаков, аналогично с паролем(больше 5 символов)

4)Зарегистрированным пользователям доступен такой себе мини личный кабинет  , и на главной странице скрыта форма авторизации.

5)Проверка при регистрации и авторизации на пустые поля реализованно при помощью атрибутов html5 required

6)Ну и кнопочка "Выйти".

 

Если кому не лень, то можете посмотреть на мой говно код  и функционал самой формы и высказать критику)
А ещё, дайте какое-то задание связанное с этой формой, на реализацию)

 

index.php

<?phpsession_start();include ("db_connect.php");?><html><head><title>Главная страница</title></head><body style="background: #ddd"><div style="width: 300px; margin: 0 auto; text-align: center;"><?phpif(!isset($_SESSION['name'])) {    echo "Вы зашли как гость";?></div><br /><div style="width: 270px; margin: 0 auto; border: 1px solid #aaa; padding: 10px;"><table><form method="post" action="login.php"><tr>    <td>Логин</td>    <td><input type="text" name="e_login" required maxlength="16"></td></tr><tr>    <td>Пароль</td>    <td><input type="password" name="e_password" required maxlength="16"></td></tr><tr>    <td></td>    <td style="text-align: right"><input type="submit" name="enter" value="Войти"></td></tr></form><form action="reg.php" method="post"><tr>    <td></td>    <td style="text-align: right"><button><a href="reg.php" style="text-decoration: none; color: #000;">Регистрация</a></button></td></tr></form></table></div><?php}else {    echo "Вы вошли как " . $_SESSION['name'] . "<br>Эта <a href=\"#\">ссылка</a> доступна только зарегистрированным пользователям";    echo "<br><br>        <form method=\"post\" action=\"user.php\">        <input type=\"submit\" value=\"В личный кабинет\" />        </form>";    echo "        <form method=\"post\" action=\"logout.php\">        <input type=\"submit\" value=\"Выйти\" />        </form>";}?></body></html>

reg.php

<?phpsession_start();include ("db_connect.php");?><html><header><title>Регистрация</title></header><body style="background: #ddd"><div style="width: 320px; margin: 200px auto; border: 1px solid #aaa; padding: 10px;"><?php// Регистрацияif(isset($_POST['reg'])){    $username = strip_tags(trim($_POST['username']));    $login = strip_tags(trim($_POST['login']));    $password = strip_tags(trim($_POST['password']));    $r_password = strip_tags(trim($_POST['r_password']));    $result_login = mysqli_query($con, "SELECT login FROM reg WHERE login = '$login' LIMIT 1");    $row_login = mysqli_fetch_array($result_login);    if(strlen($login) <= 3 ){        echo ("Введите логин больше 3х символов. ");        }    else {        if(isset($row_login['login'])){            exit ("Извините, введённый вами логин <b><span style=\"color: red\">" . $_POST['login']. "</span></b> уже зарегистрирован. Введите другой логин. <a href=\"reg.php\">Назад</a>");        }        if(strlen($password) <= 5){            echo ("Введите пароль больше 5х символов");        }        else {             if($password == $r_password){                $password = md5($password);                $sq_result = mysqli_query($con, "INSERT INTO reg(username, login, password) VALUES('$username', '$login', '$password')") or die(mysqli_error($con));             }            else {                echo "<span style=\"color: red\">Пароли не совпадают</span>";             }            if ($sq_result){                exit ("Вы зарегистрированы! <a href=\"index.php\">На главную</a>");            }        }    }}?><h2>Регистрация</h2><table><form action="reg.php" method="post"><tr>    <td><label>Ваше имя<span style="font-size: 12px;">*</span></label></td>    <td><input type="text" name="username" maxlength="32" required /></td></tr><tr>    <td><label>Логин<span style="font-size: 12px;">*</span></label></td>    <td><input type="text" name="login" maxlength="16" required /></td></tr><tr>    <td><label>Пароль<span style="font-size: 12px;">*</span></label></td>    <td><input type="password" name="password" maxlength="16" required /></td></tr><tr>    <td><label>Повторите пароль<span style="font-size: 12px;">*</span></label></td>    <td><input type="password" name="r_password" maxlength="16" required /></td></tr><tr>    <td><button><a href="index.php" style="text-decoration: none; color: #000;">← Назад</a></button></td>    <td><input type="submit" name="reg" value="Зарегистрироваться"/></td></tr></form></table></div></body></html>


login.php

<?phpsession_start();include ("db_connect.php");//Авторизацияif(isset($_POST['enter'])){    $e_login = $_POST['e_login'];    $e_password = md5($_POST['e_password']);        $sq = mysqli_query($con, "SELECT * FROM reg WHERE login = '" .$e_login ."' AND password = '" .$e_password ."' LIMIT 1");    $user_date = mysqli_fetch_array($sq);        if($user_date['password'] == $e_password && $user_date['login'] == $e_login){        session_start(); //$chek = true; //Означает что человек залогинился.        $_SESSION['name'] = $e_login;        header("Location: user.php");    }    else {        echo "Извините, вы ввели не правельный логин или пароль <a href=\"/index.php\">Назад</a>";    }}?>

user.php

<?phpsession_start();include("db_connect.php");?><html><header><title>Регистрация</title></header><body style="background: #ddd"><div style="width: 300px; margin: 0 auto;"><h2>Добро пожаловать, <span><?php echo $_SESSION['name'];?>! </span></h2><?phpif($_SESSION['name']){ // Выводим информацию только зарегистрированым пользователям    echo "<br>        <form method=\"post\" action=\"logout.php\">        <input type=\"submit\" name=\"logout\" value=\"Выйти\" />        </form>";}?><form method="post" action="index.php">    <input type="submit" name="logout" value="На главную" /></form><h3>Пользователи которые зарегистрировались: </h3><?php    if($_SESSION['name']){ // Выводим информацию только зарегистрированым пользователям$result = mysqli_query($con, "SELECT * FROM reg");    echo "<br>";while ($row = mysqli_fetch_array($result)){    echo $row['id'] .") ";    echo $row['login'] . " Имя— " . $row['username'] . "<br>";}}else {    echo "Sorry, информация показывается только зарегистрированным пользователям ;( <br> <a href=\"/\">На главную</a>";}?></div></body></html>

logout.php

<?phpsession_start();unset($_SESSION['name']);session_destroy();header("location:index.php");?>

Link to comment
Share on other sites

13 answers to this question

Recommended Posts

  • 0
А ещё, дайте какое-то задание связанное с этой формой, на реализацию)
 

 

1. Разделите логику и представление.

2. Добавьте Ajax

3. Реализуйте тоже самое в патерне mvc

  • Like 1
Link to comment
Share on other sites

  • 0

ну в плане pdo если сравнивать с mysqli там разница не особая то. Тут скорее по конкретной задаче смотреть нужно имхо. PDO конечно более мощная штука в плане различных субд, плюс дополнительные плюшки. но если задача стоит только php+mysql то разница не особая то.

Link to comment
Share on other sites

  • 0

Не советую использовать "==" для серьезных сверок. Читайте тут, там и написано почему, где, что и откуда выдирать готовые алгоритмы http://blog.astrumfutura.com/2015/05/phps-magic-hash-vulnerability-or-beware-of-type-juggling/

Экранируются по тегам данные для вывода, а вот если в бд, то экранируются кавычки, а вы изменяете пароль, который никогда не будет выведен. Да и вообще, не нужно совать адовое количество кавычек '" .$e_login ."' AND password = '" . запрос потом нельзя взять просто и скопировать куда-то, подредактировать. "SELECT id FROM $table WHERE pass (или  в переменную/константу для изменения потом  = :password AND state = блабла" (pdo) другое дело. Есть sprintf в конце концов. Столбцы могут измениться, к слову.

Вообще точками соединять приходится только вызовы, разнос по абзацам, если не подходит какой heredoc, соединение тегов, есть еще { }  для читаемости, массивы тоже парсятся в строках - без кавычек у ключа. Много точек в строке снижает понимание и редактирование, это уже иконографика, имхо.

Вывод в логине - прямой вывод $_POST['login']. Если бы писали в ide, то получили бы подсказку - не обращайтесь напрямую к пост. Проэкранируйте вывод. Напишете какой плагин, а будут тыкать пальцем, рассылка пройдет, это неприятно.

для md5 есть радужные таблицы, это плохой способ.

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

есть место где много условной логики if-else. Лишние кавычки - лишний мат (привет js)

if($_SESSION['name']) - можно получить предупреждение о несуществующем ключе. Да и вообще, по смыслу получается, что в $_SESSION['name'] - булево значение. а это явно немного не то.

что-то там strlen было, обработайте разные случаи и разные кодировки, http://stackoverflow.com/questions/15829554/strlen-php-function-giving-the-wrong-length-of-unicode-charactersможет чеволек первый раз регистрируется (в Сибири жил, тайге глухой и т.п =)

навскидку, я бы подкорректировал немного.

 

пс, скрипт без базы работать не должен. а у вас просто инклюдится без проверки успешности. если его нет, получите warning и ошибки далее.

есть орфографические ошибки.

и т .д.

Edited by bryknyk
Link to comment
Share on other sites

  • 0

Не советую использовать "==" для серьезных сверок. Читайте тут, там и написано почему, где, что и откуда выдирать готовые алгоритмы http://blog.astrumfutura.com/2015/05/phps-magic-hash-vulnerability-or-beware-of-type-juggling/

Экранируются по тегам данные для вывода, а вот если в бд, то экранируются кавычки, а вы изменяете пароль, который никогда не будет выведен. Да и вообще, не нужно совать адовое количество кавычек '" .$e_login ."' AND password = '" . запрос потом нельзя взять просто и скопировать куда-то, подредактировать. "SELECT id FROM $table WHERE pass (или  в переменную/константу для изменения потом  = :password AND state = блабла" (pdo) другое дело. Есть sprintf в конце концов. Столбцы могут измениться, к слову.

Вообще точками соединять приходится только вызовы, разнос по абзацам, если не подходит какой heredoc, соединение тегов, есть еще { }  для читаемости, массивы тоже парсятся в строках - без кавычек у ключа. Много точек в строке снижает понимание и редактирование, это уже иконографика, имхо.

Вывод в логине - прямой вывод $_POST['login']. Если бы писали в ide, то получили бы подсказку - не обращайтесь напрямую к пост. Проэкранируйте вывод. Напишете какой плагин, а будут тыкать пальцем, рассылка пройдет, это неприятно.

для md5 есть радужные таблицы, это плохой способ.

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

есть место где много условной логики if-else. Лишние кавычки - лишний мат (привет js)

if($_SESSION['name']) - можно получить предупреждение о несуществующем ключе. Да и вообще, по смыслу получается, что в $_SESSION['name'] - булево значение. а это явно немного не то.

что-то там strlen было, обработайте разные случаи и разные кодировки, http://stackoverflow.com/questions/15829554/strlen-php-function-giving-the-wrong-length-of-unicode-charactersможет чеволек первый раз регистрируется (в Сибири жил, тайге глухой и т.п =)

навскидку, я бы подкорректировал немного.

 

пс, скрипт без базы работать не должен. а у вас просто инклюдится без проверки успешности. если его нет, получите warning и ошибки далее.

есть орфографические ошибки.

и т .д.

 

Очень большое спасибо за проявленное терпение и анализ этой кучи Бог знает чего, этим вы сделали меня на шаг ближе к успеху) Обязательно все проанализирую и попытаюсь разобратся.

 

вот сам файл db_connect.php

<?php Header("Content-Type: text/html;charset=UTF-8");define("DB_SERVER", "mysql.hostinger.com.ua");define("DB_USER", "u986174***_admin");define("DB_PASS","199***011");define("DB_NAME","u986174***_my");$con = mysqli_connect(DB_SERVER, DB_USER, DB_PASS, DB_NAME) or die("Ошибка подключения");?>

 

А ещё, дайте какое-то задание связанное с этой формой, на реализацию)
 

 

1. Разделите логику и представление.

2. Добавьте Ajax

3. Реализуйте тоже самое в патерне mvc

 

 

все постепенно)

вот с 1го и начну) 

Edited by BlooDSikeR
Link to comment
Share on other sites

  • 0

Хочу уберечь вас от "темной стороны" силы. Не стоит использовать слова говнокод, бог знает чего и т.п. Ваш код работает - это главное, там есть с моей точки зрения ошибки, но если какой apc или еще какое расширение заработает не так, то я не прав, а вы правы. Невозможно поддерживать достаточный уровень мышления на протяжении всей системы - можно рехнуться, уехать в психологическую деформацию и т.п. Поэтому стоит вопреки принятой практике уважительно относится ко всем и вся. Я пишу кое-где раз в сто хуже чем у вас.

И да, посоветую не напарываться на мои грабли. Сначала разбирать фреймворки,  что как, потом велосипед. Я делал наоборот, в итоге - вижу это бесмыссленным. Все равно все неправильно, опыт какой-то от этого есть, но толку -  он не стоит потерянного времени. Все равно нужно писать как все, а не как хочешь.

 

И да, не стоит выкладывать пароли, логины и другую секьюрную инфу, даже как бы и бесполезную.

Edited by bryknyk
Link to comment
Share on other sites

  • 0

LunatiK, я бы сюда:

 

1. Разделите логику и представление.

2. Добавьте Ajax

3. Реализуйте тоже самое в патерне mvc

 

еще добавил бы пунктик:

 

4. безопасность

 

Т.С., а на счет заданий: организуйте разделение прав/ролей админ->юзер

Link to comment
Share on other sites

  • 0

 

Т.С., а на счет заданий: организуйте разделение прав/ролей админ->юзер

 

сейчас насоветуем человеку, что по плану ему нуна будет свою CMS написать =)

 

Вобщем к этому и идет, но он сам просил связанное с формой авторизации и регистрации :)

А ещё, дайте какое-то задание связанное с этой формой, на реализацию)
Link to comment
Share on other sites

  • 0
Вобщем к этому и идет, но он сам просил связанное с формой авторизации и регистрации :)

 

Может что-то попроще, к примеру письмо для подтверждения регистрации на почту пользователю. Ну и каптчу прикрутить они готовые есть в конце концов. Ну так для начала =)


5)Проверка при регистрации и авторизации на пустые поля реализованно при помощью атрибутов html5 required

А вот это не совсем верно, на стороне сервера обязательные поля тоже нужно проверять на заполненность.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Similar Content

    • By Лелик
      Источник для импорта сменил кодировку с utf-8 на  windows-1251. Всвязи с этим не выполняются циклы импорта, ошибка 1064 и кириллица выводится в квадратах. Также вверху шапки сайта при загрузке страницы админки с импортом и при оформлении заказа (на другой линии) [Unknown: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /home/p10824/xn--80agbgp3aafdnsm0c.xn--p1ai/system/library/partner.php on line 44 ]  Нужно адаптировать код по примеру [$q = 'select id, fio from `users`';
      $res = mysql_query($q);
      while (($row = mysql_fetch_assoc($res)) !== false) {
      // Преобразуем fio из utf-8/latin1 в windows-1251
      $s = iconv('utf-8', 'windows-1251', $row['fio']);
      // Преобразуем строку из однобайтной кодировки обратно в utf-8, выдав её за windows-1251
      $s = iconv('windows-1251', 'utf-8', $s);
      // Сохраняем назад в БД
      $q = 'update `users` set fio = "'.addslashes($s).'" where id = '.$row['id'];
      mysql_query($q);
      }]. Файл для работы прилагаю
      partner.php
    • By Only091
      Помогите пожалуйста, не получается сделать постраничную навигацию. Делал все по урокам. в Итоге получилось сделать два разных каталога один с фильтрами другой с постраничной навигацией. И теперь я пытаюсь объединить два каталога. Но не получается. Сами файлы урока в архике каталог. Буду очень благодарен если мне помогут! catalog.phpcatalogDB.js
      каталог.7z
    • By stonelabs
      Всем привет!

      Наша компания (https://stone-labs.com/) ищет команды (!) разработчиков для реализации ряда заказных проектов. Местоположение не важно - мы практикуем удаленную работу.
       
      Обязательные требования:
      Laravel или Symfony frameworks jQuery (UI), JavaScript, Ajax, Bootstrap MySQL REST API, опыт внедрения Third-party APIs английский на уровне чтения и понимания технической документации опыт в разработке веб приложений и их архитектуры с нуля корректное использование git & pull request flow работа в дневное время во временной зоне UTC +3  
      Будет плюсом, если у вашей команды есть:
      опыт с GitLab CI/CD, Jenkins опыт с MySQL Cluster, MongoDB, PostgreSQL, Redis опыт с Vue.js опыт Linux администрирования, SSH, Nginx, DevOps  
      Если вам интересно сотрудничество, пожалуйста, пишите на наш ящик wanted@stone-labs.com 
    • By Defroing
      <form method="POST" action= "action_handler.php" id="form"> <section class="table_1"> <table class="iksweb"> <tbody> <tr> <td rowspan="3"><b>История компании «Mc donald's»</b> <h3 class="the">Кто основал компанию «Mc donald's»?</h3> <section class="conteiner"> <div class="checkbox"> <input type="checkbox" class="i-6" id="i6" value="0" name="formDoor[]"> <label for="i6" tabindex="12">Роналд Макдоналд</label> </div> <div class="checkbox"> <input type="checkbox" class="i-6" id="i7" value="0" name="formDoor[]"> <label for="i7" tabindex="13">Рэй Крок</label> </div> <div class="checkbox"> <input type="checkbox" class="i-6" id="checkbox_68" value="1" name="formDoor[]"> <label for="checkbox_68" tabindex="14">Братья Дик и Мак Макдоналд</label> </div> <div class="checkbox"> <input type="checkbox" class="i-6" id="checkbox_170" value="0" name="formDoor[]"> <label for="checkbox_170" tabindex="14">Клинт Иствуд</label> </div> <div class="out-block out-6"></div> </section> </td> </tr> </tbody> </table> <div class="dsw"> <button class="b-6" tabindex="11" id="btn-1" type="submit" name="formSubmit">Отправить</button> </div> </form> <?php mysql_connect("localhost", "root", ""); mysql_select_db('olala') or die(mysql_error()); if(isset($_GET['submit'])){ $arr=$_GET; foreach ($arr as $key => $value) { $reg="/^check/";//отбираю нужные элементы if( preg_match ($reg,$key )) { //$new_mass[]=$arr[$key]; //print_r($new_mass); echo $arr[$key]; $sql_1="INSERT INTO `table_one` (`name`) VALUES('$arr[$key]')"; mysql_query($sql_1) or die(mysql_error()); } } } ?>  Создаю опросник и хочу, чтобы чекбоксы заносились в БД(таблицу пока не создавал). Хотелось узнать на счёт php кода, сможете подсказать, что в нём не так (дать какие нибудь советы). В openserver опросник пока не выкладывал.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy