C++ Гайд Пишем простою авторизацию ( PHP/C++ ) и настраиваем базу данных

Забаненный
Статус
Оффлайн
Регистрация
2 Мар 2021
Сообщения
1,083
Реакции[?]
406
Поинты[?]
1K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
В данном гайде будет приведен самый простой пример авторизации с помощью логина и пароля от аккаунта без привязки к HWID.
Весь материал из гайда можно расширять в любых направлениях, в каких позволяет ваша фантазия

Для создания многопользовательской авторизации понадобится:
  • Интернет-хостинг ( в моем случае это http://beget.com/ )
  • База данных MySQL ( берем из хостинга )
  • Проект C++
I. Настраиваем базу данных MySQL
Не буду здесь расписывать абсолютно все моменты ( оплата хостинга / создание базы данных ) это уже слишком, не хочу лить воду в этом гайде, перейдем к настройке.

После того как мы создали свою базу данных, нам нужно настроить таблицу базы данных ( на данном скриншоте users - это таблица, у вас будет чисто, нажмите на "Новая" что-бы создать новую таблицу в базе данных )
1679739064277.png
Поскольку авторизация будет включать в себя только логин и пароль от аккаунта, нам нужно создать два столбца, назовем их соответственно login и password
1679739266466.png
Вы можете сами ознакомиться с определением типа VARCHAR, дабы я здесь не расписывал это.
Длину нашего логина и пароля поставим в 32 символа для примера ( вы можете использовать любую длину строки )
Остальные параметры нам не особо важны, если у вас есть желание, вы можете ознакомиться с ними сами

Далее нажимаем кнопку "Сохранить" справа внизу ( не забываем назвать нашу таблицу сверху в поле "Имя таблицы", я назову test ).


II. Пишем PHP скрипт для работы с базой данных
Создаем файл index.php ( в нем мы будем писать всю логику скрипта для работы с MySQL таблицей )
Подключаемся к нашей базе данных:
PHP:
<?php
    $mysqli = new mysqli('127.0.0.1', 'Имя базы данных', 'Пароль от базы данных', 'Имя базы данных повторно');
?>
Из-за того что наш php скрипт будет лежать на том же хостинге, где хранится наша база данных, в подключении мы используем локальный IP адрес.
Наш скрипт будет принимать данные с помощью GET запросов от клиента ( проекта C++ ) по этому создадим сразу три переменные, которые будут заполняться GET-запросом:
PHP:
<?php
    $login = $_GET['login'];
    $password = $_GET['password'];
    $api = $_GET['api'];
    $mysqli = new mysqli('127.0.0.1', 'Имя базы данных', 'Пароль от базы данных', 'Имя базы данных повторно');
[SIZE=5]?>
[/SIZE]
Переменная $api служит направляющей переменной нашего скрипта ( для того что бы обращаться к определенному блоку, давайте будем думать что блок 0 - регистрация, блок 1 - авторизация )

Далее создадим новую переменную - $sql_query, она будет содержать статус нашего запроса для базы данных.
Сразу же напишем первый запрос: добавление логина и пароля в базу данных ( т.е регистрация, блок 0 )
PHP:
<?php
    $login = $_GET['login'];
    $password = $_GET['password'];
    $api = $_GET['api'];

     $mysqli = new mysqli('127.0.0.1', 'Имя базы данных', 'Пароль от базы данных', 'Имя базы данных повторно');

    switch($api)
    {
        case 0:
            $sql_query = $mysqli->query( "INSERT INTO `test`(`login`, `password`) VALUES ('$login', '$password')" );
            break;
    }
?>
Мы можем проверить правильность написанного кода, ведь GET-запрос это просто правильно сформированная ссылка.
Давайте выведем success если наш блок кода отработал:
PHP:
<?php
    $login = $_GET['login'];
    $password = $_GET['password'];
    $api = $_GET['api'];

     $mysqli = new mysqli('127.0.0.1', 'Имя базы данных', 'Пароль от базы данных', 'Имя базы данных повторно');

    switch($api)
    {
        case 0:
            $sql_query = $mysqli->query( "INSERT INTO `test`(`login`, `password`) VALUES ('$login', '$password')" );
            print("success!");
            break;
    }
?>
1679741236591.png

После запроса c помощью GET метода, мы увидим, что в нашей базе данных заполнились поля login и password с нашими данными Arkting Piere

Далее напишем авторизацию, по факту это просто проверка наличия данных в нашей таблице ( пишем в блоке 1 )

PHP:
<?php
    $login = $_GET['login'];
    $password = $_GET['password'];
    $api = $_GET['api'];

    $mysqli = new mysqli('127.0.0.1', 'Имя базы данных', 'Пароль от базы данных', 'Имя базы данных повторно');

    switch($api)
    {
        case 0:
            $sql_query = $mysqli->query( "INSERT INTO `test`(`login`, `password`) VALUES ('$login', '$password')" );
            $api_response = "Success registration!";
            break;
        case 1:
            $sql_query = $mysqli->query( "SELECT `login` FROM `test` WHERE `password` = '$password'" );
            if ( $sql_query->num_rows != 0 )
            {
                $api_response = "Success auth!";
                break;
            }
            break;
    }
    print($api_response);
?>
Проверка $sql_query->num_rows != 0 означает, что SELECT смог найти хотя бы 1 строку наших GET данных, означая, что пользователь зарегистрирован. Он выбирает поле login где password равен введенному паролю.
Переменная $api_response хранит в себе обычный ответ от скрипта.

Как же теперь это связать с проектом C++? Приступим.

III. Пишем клиент на C++
Для чтения ответа от php скрипта мы воспользуемся таким методом:
C++:
std::string CreateUrlRequest(std::string url) {
    std::string request_data = "";

    HINTERNET open = InternetOpenA(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
    if (!open)
        return request_data;

    HINTERNET http_session = InternetConnectA(open, "Ваш URL адрес хостинга", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, NULL);
    if (!http_session) {

        InternetCloseHandle(open);
        return request_data;

    }

    HINTERNET http_request = HttpOpenRequestA(http_session, "GET", url.c_str(), NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_RELOAD, 0);
    if (!http_request) {

        InternetCloseHandle(open);
        InternetCloseHandle(http_session);

        return request_data;
    }

    char request[0x1000] = { 0 };
    std::string headers = "Content-Type: text/html\r\nUser-Agent: license";
    if (!HttpSendRequestA(http_request, headers.c_str(), headers.size(), request, url.size())) {

        InternetCloseHandle(open);
        InternetCloseHandle(http_session);
        InternetCloseHandle(http_request);
        return request_data;

    }

    char buffer[0x1000] = { 0 };
    DWORD read = 0;

    while (InternetReadFile(http_request, buffer, sizeof buffer - 1, &read) && read)
        request_data.append(buffer, read);

    InternetCloseHandle(open);
    InternetCloseHandle(http_session);
    InternetCloseHandle(http_request);

    return request_data;
}
Далее дело за малым, считать информацию после нашего GET запроса с помощью выше написанной функции. Приступим.
В нашей базе данных уже хранится логин: Arkting пароль: Piere, давайте напишем авторизацию для этих данных.

C++:
int main()
{
    std::string login, password, response;
    std::cout << "Введите ваш логин: ";
    std::cin >> login;
    std::cout << "Введите ваш пароль: ";
    std::cin >> password;
    response = CreateUrlRequest( "/index.php?api=1&login=" + std::string( login ) + "&password=" + std::string( password ) );
    printf( "%s\n", response );
}
Теперь если мы введем верные данные, в консоли выведет Success auth!
Далее дело за вами, развивайте данный код как только можно.
Удачи!
 
Последнее редактирование модератором:
Пользователь
Статус
Оффлайн
Регистрация
17 Ноя 2021
Сообщения
252
Реакции[?]
35
Поинты[?]
3K
Забаненный
Статус
Оффлайн
Регистрация
16 Мар 2023
Сообщения
37
Реакции[?]
23
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
pdo для слабых как я понял ( ну или хоть какая то сесурити от скл инъекций )? С таким кодом всю твою бд разъебут, спиздят и обоссут
 
Забаненный
Статус
Оффлайн
Регистрация
2 Мар 2021
Сообщения
1,083
Реакции[?]
406
Поинты[?]
1K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
pdo для слабых как я понял ( ну или хоть какая то сесурити от скл инъекций )? С таким кодом всю твою бд разъебут, спиздят и обоссут
представитель типичного токсик-ру коммьюнити
тред сделан для тех кто просто хочет узнать как работать с php + mysql + c++, а не для того что бы "бд разъебать, спиздить и обоссать", clowen
 
Забаненный
Статус
Оффлайн
Регистрация
16 Мар 2023
Сообщения
37
Реакции[?]
23
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
представитель типичного токсик-ру коммьюнити
тред сделан для тех кто просто хочет узнать как работать с php + mysql + c++, а не для того что бы "бд разъебать, спиздить и обоссать", clowen
Я не токскик, я указал на то что ты делаешь бесполезную статью, которых миллионы во всем интернете, и указал на то, что ты выложил код который будет дико уязвимым к любым инъекциям. Более полезнее было бы если бы ты писал пример свой с использованием PDO а не обычным мусклом
 
Забаненный
Статус
Оффлайн
Регистрация
2 Мар 2021
Сообщения
1,083
Реакции[?]
406
Поинты[?]
1K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Я не токскик, я указал на то что ты делаешь бесполезную статью, которых миллионы во всем интернете, и указал на то, что ты выложил код который будет дико уязвимым к любым инъекциям. Более полезнее было бы если бы ты писал пример свой с использованием PDO а не обычным мусклом
в чем проблема написать самому, а не пиздеть на бесполезность темы? Когда я искал эту информацию - на югейме нормального я не нашел
1679745002181.png
 
feel irl
Участник
Статус
Оффлайн
Регистрация
21 Дек 2018
Сообщения
677
Реакции[?]
294
Поинты[?]
16K
будет интересно увидеть как у тебя угонят БД через эту хуету
pdo для слабых как я понял ( ну или хоть какая то сесурити от скл инъекций )? С таким кодом всю твою бд разъебут, спиздят и обоссут
Ребят, прочитайте название темы. Вы к чему говорите здесь о небезопасности данной реализации? Тот кто шарит, очевидно, поймёт, что это плохой вариант.
Случайный чувак, кто пришёл и посмотрел как именно надо делать такие штуки, просто посмотрит и уйдёт, а не будет разбираться как же защищаться от sql иньекций, ибо ему это нахуй не всралось.
Ситуация примерно тоже самое, что и когда приходишь в первый класс школы, а тебе чуваки говорят: "надо запоминать счёт, а не считать на пальцах".
 
Начинающий
Статус
Оффлайн
Регистрация
23 Сен 2019
Сообщения
51
Реакции[?]
23
Поинты[?]
1K
2.1. Запрещено оскорбление участников форума в любом виде. В том числе проявление любой грубости, угроз и нецензурных высказываний даже в скрытой форме.
Все есть на югейме, пост для школьников
в этом и смысл, это во первых ПРОСТАЯ реализация, а во вторых тот кто знает как сделать авторизацию сюда бы не зашел. Ты попал в точку это статья для школьников / пастеров кому просто нужно там условно для друзей лоадер сделать ради прикола
 
Последнее редактирование модератором:
Пользователь
Статус
Оффлайн
Регистрация
22 Май 2022
Сообщения
203
Реакции[?]
43
Поинты[?]
6K
Забаненный
Статус
Оффлайн
Регистрация
2 Мар 2021
Сообщения
1,083
Реакции[?]
406
Поинты[?]
1K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Разработчик
Статус
Оффлайн
Регистрация
1 Сен 2018
Сообщения
1,598
Реакции[?]
880
Поинты[?]
114K
Ребят, прочитайте название темы. Вы к чему говорите здесь о небезопасности данной реализации? Тот кто шарит, очевидно, поймёт, что это плохой вариант.
Случайный чувак, кто пришёл и посмотрел как именно надо делать такие штуки, просто посмотрит и уйдёт, а не будет разбираться как же защищаться от sql иньекций, ибо ему это нахуй не всралось.
Ситуация примерно тоже самое, что и когда приходишь в первый класс школы, а тебе чуваки говорят: "надо запоминать счёт, а не считать на пальцах".
пдо намного легче даже в реализации, тот код который он сделал не простой, а критически опасный
 
Последнее редактирование:
Модератор раздела Рынок
Модератор
Статус
Оффлайн
Регистрация
27 Апр 2019
Сообщения
106
Реакции[?]
47
Поинты[?]
1K
Неплохо, но опять же как написали выше, нет защиты, хотя новичку это лучше знать, чем потом попасться)
Тред полезный:seemsgood:
И советую не юзать свитчи, ибо они куда загруженные чем тем же самые if else (Но это имхо не более)

Кейс можно переписать проще
PHP:
            $sql_query = $mysqli->query( "SELECT `login` FROM `test` WHERE `password` = '$password'" );
            if ($sql_query->num_rows)
            {
                $api_response = "Success auth!";
                break;
             } else { 
                $api_response = "unauthorized 403";
            break;
           }
Нет смысла юзать два брика, ибо ты и так можешь пихнуть его в условие. Хотя навреное все таки грамотно в плане точки реализации будет брик в конце. Ваще не пейте пиво и не пишите на пыхе
 
Последнее редактирование:
Забаненный
Статус
Оффлайн
Регистрация
21 Дек 2020
Сообщения
169
Реакции[?]
5
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
IRQL_APC_LEVEL
Пользователь
Статус
Оффлайн
Регистрация
25 Авг 2018
Сообщения
211
Реакции[?]
88
Поинты[?]
3K
представитель типичного токсик-ру коммьюнити
тред сделан для тех кто просто хочет узнать как работать с php + mysql + c++, а не для того что бы "бд разъебать, спиздить и обоссать", clowen
Где логика то? Твой пост как раз показывает то, как работать с БД не надо. Если ты хотел продемонстрировать пример "от обратного", то показано отлично! Вот только стоило об этом как-то обмолвиться, чтобы не вводить людей в заблуждение о правильности реализации...

Код на плюсах тоже имеет некие огрехи, например "CreateUrlRequest( "/index.php?api=1&login=" + std::string( login ) + "&password=" + std::string( password ) );" - тут прям просится какая-нибудь функция для форматирования строк (std::format например). Но делать так, в любом случае, нельзя. Для таких целей куда больше подходят POST запросы.

К тому же, если ты позиционируешь свою статью как "Для начинающих", то стоило бы обмолвится о шифровании трафика (хотя бы в двух словах сказать про: ECC, Poly1305, XSalsa20, AES и так далее), а также сказать о том, что текстовые протоколы - это моветон для таких решений. И нужно использовать какой-нибудь бинарный протокол (по типу protobuf-а).

К слову, раз у тебя реализована авторизация, то неплохо было бы показать (или хотя бы сказать) работу с сессиями. Ну и также пароли нужно хранить в хешированом виде
 
Последнее редактирование:
Забаненный
Статус
Оффлайн
Регистрация
21 Дек 2020
Сообщения
169
Реакции[?]
5
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Сверху Снизу