Форум: "Начинающим";
Текущий архив: 2010.10.24;
Скачать: [xml.tar.bz2];
ВнизОшибка в SQL запросе Найти похожие ветки
← →
mefodiy (2010-07-29 13:29) [0]Мне нужно получить в зашифрованном виде пароль, введенный пользователем и сравнить его с паролем, который имеется в базе.
В программе делаю запрос в ADQuery (AnyDAC):
SELECT PASSWORD(" + QuotedStr(PasswordEdit.Text) + ") AS In_password,Password AS Sql_password" +
" FROM MySql.User" +
" WHERE User=" +QuotedStr(UserComboBox.Text)
который приводит к ошибке:
Variable length column[In_password] overflow. Value length - [42], column maximum length - [41].
Этот же запрос MySQL Query Browser (если вместо PasswordEdit.Text и UserComboBox.Text прописать значения) выполняется без ошибок.
В чем тут дело?
← →
12 © (2010-07-29 13:41) [1]
> PASSWORD(" + QuotedStr(PasswordEdit.Text) + ")
и что это должно дать в итоге?
← →
Dennis I. Komarov © (2010-07-29 14:01) [2]Сколько раз говорить, не храните пароли в базе, храните там hash
← →
mefodiy (2010-07-29 14:02) [3]Это дает зашифрованное значение введенного пользователем пароля.
Вынужден это делать, так как в базе хранится необратимо зашифрованный пароль.
Потом я сравниваю In_password с Sql_password и, если они совпадают, то разрешаю законнектиться к базе в соответствии с введенными именем и паролем, чтобы действовали прописанные для этого пользователя ограничения
Может есть вариант и получше?
← →
Медвежонок Пятачок © (2010-07-29 14:03) [4]убей, мефодий, колонки в своем ADQuery, созданные в дизайн-тайме.
← →
Anatoly Podgoretsky © (2010-07-29 14:05) [5]Разве у MySQL нет своей системы аутентификации и авторизации, что бы так городить велосипед.
← →
mefodiy (2010-07-29 14:28) [6]
Сколько раз говорить, не храните пароли в базе, храните там hash
Так это не моя таблица "User", а таблица MySql, в которой она хранит имена пользователей и пароли (сам пароль в зашифрованном виде).
← →
12 © (2010-07-29 14:31) [7]а параметров нет в этом AnyDAC?
← →
Anatoly Podgoretsky © (2010-07-29 14:31) [8]> mefodiy (29.07.2010 14:28:06) [6]
В виде хеша.
Но речь не об этом, зачем двойная аутентификация, что делать нечего, лучше
делом заняться.
← →
mefodiy (2010-07-29 16:35) [9]Вопрос решился созданием небольшой функции:
CREATE FUNCTION MyPassword (f_password CHAR(41)) RETURNS CHAR(41)
"BEGIN"
" RETURN PASSWORD(f_password);"
"END";
и заменой запроса на
SELECT MyPassword(" + QuotedStr(PasswordEdit.Text) + ") AS In_password,Password AS Sql_password" +
" FROM MySql.User" +
" WHERE User=" +QuotedStr(UserComboBox.Text)
Всем спасибо.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.10.24;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.003 c