#c #sqlite
Вопрос:
Я пытаюсь написать функцию входа в систему на C , где пользователь вводит свой идентификатор. Этот идентификатор входит в запрос API SQLite, и я хотел бы сохранить результат запроса (то, что должно быть паролем) в переменной. А также пользователь вводит свой пароль, и я хотел бы сравнить введенный пароль и фактический пароль. Проблема в том, что фактический пароль, результат запроса-это постоянный символ без знака*, а введенный пароль, очевидно, является строкой. Насколько я знаю, я не могу преобразовать строку в символ const без знака или наоборот. Ниже приведен код, вот где я сейчас нахожусь. Есть ли какой-нибудь способ сравнить два пароля?
string studentid;
sqlite3* db;
sqlite3_stmt* stmt;
auto rc = sqlite3_open("timetable_newest.sqlite", amp;db);
if (rc != SQLITE_OK)
{
cerr << "Couldn't open database" << sqlite3_errmsg(db);
sqlite3_close(db);
exit(EXIT_FAILURE);
}
cout << "Enter your student ID: " << endl;
cin >> studentid;
string select = "SELECT password FROM Student_login WHERE id='" studentid "'";
sqlite3_prepare_v2(db, select.c_str(), -1, amp;stmt, 0);
const unsigned char* password; //has to be const unsigned char*, unless it won't compile
password = sqlite3_column_text(stmt, 1);
cout << "Enter your password" << endl;
string password_input;
cin >> password_input; //this is where I am now, the solution should start from here
Извините, если вопрос глупый, или я не вижу очевидной вещи, я довольно новичок в c . Заранее благодарю вас!
Комментарии:
1. Вы можете сравнить (содержимое строки)
std::string
сconst char*
(password == password_input
).2. Кстати, лучше хранить пароль не в БД, а в каком-нибудь «хэше».
3. Ваш код подвергается SQL-инъекции ! Представьте, что ваш пользователь вводит что-то вроде
foo' or 1=1 --
4. xkcd.com/327
5. В качестве полностью альтернативного подхода, почему бы не позволить SQLite выполнить тяжелую работу и проверить, существует ли пользователь с правильным (хэшированным) паролем? Затем вам просто нужно подсчитать количество строк результатов.