Авторизация на C++ с SQLite: полный пример и объяснение

    В этой статье мы подробно разберём консольное приложение на C++, которое использует SQLite для хранения учётных записей. Код демонстрирует создание таблицы, вставку логинов и паролей, а также базовую обработку ошибок. Материал будет полезен начинающим разработчикам, которые хотят понять интеграцию СУБД SQLite в свои проекты на C++.

    Структура приложения и подключение библиотек

    Программа подключает стандартные заголовочные файлы #include<string> и #include <iostream>, а также заголовочный файл SQLite #include "sqlite3.h". Используется пространство имён using namespace std;, что упрощает вызов функций ввода-вывода. В функции main() объявляются переменные: vib для выбора действия, err для сообщений об ошибках, указатели db (база данных) и stmt (подготовленный запрос).

    Открытие базы данных и создание таблицы

    С помощью sqlite3_open("masql.db", &db) открывается или создаётся файл базы данных. Затем выполняется SQL-запрос: CREATE TABLE IF NOT EXISTS Egor(login varchar(100),password varchar(100)). Если таблица уже существует, запрос не вызывает ошибки. Проверка if (rc != SQLITE_OK) выводит сообщение об ошибке при неудачном выполнении. После этого идёт подготовка запроса SELECT q,w,name from Egor - однако в таблице нет столбцов q, w и name, что приведёт к ошибке времени выполнения.

    Меню выбора и обработка ввода

    Пользователю предлагается три варианта: [1] log in, [2] sign in, [3] number of account. В текущей реализации обрабатывается только первый пункт. При выборе vib == 1 программа запрашивает логин и пароль, затем конкатенирует их в строку SQL-запроса: insert into Egor VALUES(" + log + ","+ pas +"). После выполнения запроса выводится сообщение об ошибке вставки, если она произошла. В конце база данных закрывается вызовом sqlite3_close(db).

    Типичные проблемы и как их исправить

    Уязвимость SQL-инъекций

    Прямая конкатенация пользовательского ввода в SQL-запрос крайне опасна. Злоумышленник может передать специальные символы, например "; DROP TABLE Egor; --, что приведёт к удалению таблицы. Рекомендуется использовать подготовленные запросы (prepared statements) с привязкой параметров через sqlite3_bind_text().

    Неверный SELECT-запрос

    Запрос select q,w,name from Egor обращается к несуществующим столбцам. Это вызовет ошибку SQLITE_ERROR. Правильный запрос должен использовать столбцы, определённые в таблице: SELECT login, password FROM Egor. Убедитесь, что имена столбцов в запросе соответствуют схеме таблицы.

    Отсутствие обработки выбора 2 и 3

    Код не содержит веток для vib == 2 (регистрация) и vib == 3 (количество аккаунтов). При выборе этих пунктов программа просто завершится без выполнения каких-либо действий. Для полноценного приложения необходимо добавить соответствующие блоки else if или switch.

    Безопасное хранение паролей

    В примере пароль сохраняется в открытом виде. Это недопустимо для реальных проектов. Используйте хеширование (например, SHA-256 или bcrypt) перед записью в базу данных. При проверке логина сравнивайте хеш введённого пароля с сохранённым хешем. Также стоит добавить соль (salt) для усиления защиты от радужных таблиц.

    Заключение

    Рассмотренный код - хорошая отправная точка для изучения работы с SQLite в C++. Однако он требует доработок: устранения SQL-инъекций, исправления запросов, добавления полноценного меню и безопасного хранения паролей. Используйте этот пример как основу для создания надёжных приложений с авторизацией.

    Часто задаваемые вопросы