Форум программистов, компьютерный форум, киберфорум
anomal6
Войти
Регистрация
Восстановить пароль
Оценить эту запись

PHP & C# [простой пример реализации входа в личный кабинет]

Запись от anomal6 размещена 18.05.2022 в 08:55

Добра всем читающим.

"Шарахаясь" по разным форумам вижу частый вопрос о том как же сделать вход в личный кабинет на сайтах через Net.
Если материалы и есть, то они все устаревшие, под php 5.5 и <

Данный материал нацелен больше на тех, у кого знаний языка пока маловато)))
Буду использовать php7.4, MySQLi (не PDO), NetFramework 4.8

Итак. Представим что у нас есть сайт, на нём есть личный кабинет, и тут мы решили сделать приложение (на телефон, на ПК, хоть на XBOX не имеет значения)

Об условимся самым простым примером. Представим что у нас есть таблица users со следующим содержанием.
ID - который будет инкрементом
Login - varchar
Password - varchar
Email - varchar
Mobile - int

Первым делом создадим config.php файл (если конечно сайт есть а конфига до сих пор нету)
config.php
PHP
1
2
3
4
5
6
7
8
9
10
11
<?php
    
$MySQL_HOST = 'localhost';                     //Хост
$MySQL_USER = 'USERNAME';                 //Имя пользователя     
$MySQL_USER_PASS = 'PASSWORD';       //Пароль от БД
$MySQL_DB = 'MYDB';                           //Название БД
 
 $mysqli = mysqli_connect($MySQL_HOST, $MySQL_USER, $MySQL_USER_PASS, $MySQL_DB);
 mysqli_set_charset($mysqli, 'utf8');
 
?>


Такого конфига нам до жопы хватит.

Теперь нам нужен php скрипт который примет через POST запрос логин и пароль и проверит в БД учётные данные и вернёт клиенту что-то в ответ.
Будем использовать самый простой вариант (пока нам не до SQL_Inject, шифрования и всякой защиты) в ответ посылать будем простой echo.

login.php
PHP
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
<?php
 
require_once 'conf.php'; //Подключим наш конфиг файл
 
 
/*Проверим, чтобы в POST запросе не было пустоты (вдруг кто через сайт будет пробовать а не через наше приложение*/
if(isset($_POST["username"]) && isset($_POST["password"])){
 
//mysqli_real_escape_string — Экранирует специальные символы в строке для использования в SQL-выражении
    $user = mysqli_real_escape_string($mysqli, $_POST["username"]); //Запишем
    $pass = mysqli_real_escape_string($mysqli, $_POST["password"]); //Логин и пароль в переменные
 
 //Составим SQL запрос для выполнения
//Выберем всех в таблице users где логин будет совпадать с нашим переданным логином
    $sql= "SELECT * FROM users WHERE login ='$user'";
 
//Выполняем наш запрос
    $query =  mysqli_query($mysqli, $sql);
 
//получим результат чтобы с ним работать
    $result = mysqli_fetch_array($query);
 
//Разбираем на ячейки наш результат
    $rowcount = mysqli_num_rows($query);
    
 
//Да можно проще $mysqli->query($sql), но речь о понимании процесса
 
 
//Если логин есть в БД то запрос обязательно вернёт ячейку с пользователем. Поэтому проверим, есть ли у нас ячейка?
    if($rowcount == 1) {
 
//Отлично. Теперь проверим наш пароль, совпадает ли он с паролем который мы приняли в POST
//Данный метод проверки как пример, проверять нужно в зависимости от того как шифровали пароль
//мой метод шифровки был с рекомендациями на php.net
//$passwd_hash = password_hash($passwd, PASSWORD_BCRYPT, $options);
        if(password_verify($pass, $result["passwd"]))
        { 
                      //Ну и отлично. Тут проверка пройдена.
                      echo "Successful";
        }
                
                //Если пароль не верный сообщим об этом. Вдруг кто-то пытается взломать
        else { echo "WrongPass"; }
    }
 
        //Ну а если нет ячейки, значит и нет пользователя, и тоже об этом сообщим
    else if($rowcount == 0)
    {
        echo "NoAccount";
    }
}
 
//Ну а если пустые POST запросы, то и выводить нечего.
else {
echo "Blank";
}
 
?>


Ну и переходим собсна к Net части.
Будем использовать WinForm для простоты


NETПервым делом конечно же ЮЗИНГИ
C#
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
using System.Collections.Specialized;
using System.Net;
 
NameValueCollection DataToSend = new NameValueCollection(); //Будем использовать коллекцию string'ов
WebClient wc = new WebClient(); //Веб обязательно мы же будем подключаться в ИнтернетЫ
const string url_login = "https://site.ru/cp/login.php"; //Путь в интернетах,  где лежит наш созданный login
 
//Сделаем наш метод авторизации
 
void Auth()
{
     //Разрешим сертификат и защищённое соединение даже если сертификат просрочен
     //Нужен только в том случае если у нас подключение через https
     ServicePointManager.Expect100Continue = true;
     ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
 
//Обязательно ключ DataToSend используем с таким же названием который принимаем в POST запросе
      this.DataToSend["username"] = textBoxLogin.Text; 
      this.DataToSend["password"] = textBoxPass.Text;
 
//В ответе получим сообщения от сервера. wc.UploadValues отправит на нужный адрес наш POST
      string answer = Encoding.UTF8.GetString(wc.UploadValues(url_login, this.DataToSend));
 
 switch (answer)
            {
 
                case "Successful":
                 MessageBox.Show("УРАА! Мы вошли в Личный Кабинет!!!");
                break;
 
                case "WrongPass":
                 //Тут обрабатываем не верный пароль
                break;
 
                case "NoAccount":
                 //Тут мы знаем что логина нашего нет
                break;
 
                case "Blank":
                 //А здесь POST пустой
                break;
                
}


Использовать код можно на NetStandard, NetFramework, NetCore
И развернуть реализацию куда больше.

Например для какого нибудь лаунчера для MainCraft подойдёт за глаза.

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

Данный материал не претендует на научную статью, а лишь демонстрирует пример авторизации на современный лад.

Не по теме:

Ну и срач в комменты как всегда приветствуется

Размещено в Без категории
Показов 3695 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru