Авторизация на 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-инъекций, исправления запросов, добавления полноценного меню и безопасного хранения паролей. Используйте этот пример как основу для создания надёжных приложений с авторизацией.