Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Кузнецов Михаил
0 / 0 / 2
Регистрация: 15.05.2015
Сообщений: 73
1

Присвоить значение в using(MySqlConnection){}

09.12.2016, 20:10. Просмотров 292. Ответов 7
Метки нет (Все метки)

Есть следующий код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
        public bool Authorize(string login, string password)
        {
            credentials.Authorized = false;
 
            ConnectToSql();
            if (Connection.State == ConnectionState.Closed)
            {
                MessageBox.Show("Нет подключения к серверу.");
                return false;
            }
            if (login == null || password == null)
            {
                MessageBox.Show("Поле(-я) не заполнено(-ы)");
                return false;
            }
            password = Info.GetMd5Hash(Info.GetMd5Hash(password));
            try
            {
                using (Connection)
                {
                    MySqlDataReader reader = new MySqlCommand(string.Format("SELECT * FROM `l_users` WHERE `Login` = '{0}'", login),
                            Connection).ExecuteReader();
                    while (reader.Read())
                    {
                        if (reader.GetString("Password") == password)
                        {
                            string[] d = new[] { login, password, reader.GetString("Email"), reader.GetString("Nickname") };
                            credentials = new Credentials(d[0], d[1], d[2], d[3], true);
                        }
                        //MessageBox.Show(credentials.Authorized.ToString());
                    }
                    reader.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ошибка авторизации");
                credentials.Authorized = false;
            }
 
            return credentials.Authorized;
        }
Беда в том, что возвращается не то значение, т.е. false в любом случае, хотя я присваиваю true. Не могу понять, где ошибка.
Подскажите пожалуйста.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2016, 20:10
Ответы с готовыми решениями:

MySqlConnection.state не изменяется по событию
Доброго дня. Есть такой очень примитивный кусок кода if (MyConnect.State !=...

MySqlConnection, несколько запросов одновременно
В общем написал вот такой класс для сервера, заметил что если не освободить...

Получить значение ячейки из таблицы и присвоить это значение в другую
Привет всем. Мне необходимо получить значение ячейки из таблицы и присвоить это...

MySqlConnection ssh-туннелирование
try { //string ConnetStr =...

Присвоить значение из Словаря переменной
Здравствуйте ! С этого место объясняется как работать In-memory storage ...

7
OwenGlendower
Супер-модератор
Эксперт .NET
9324 / 8183 / 3491
Регистрация: 17.03.2014
Сообщений: 16,249
Записей в блоге: 1
09.12.2016, 20:56 2
Кузнецов Михаил, запусти под отладчиком и посмотри почему так происходит. Может условие if (reader.GetString("Password") == password) не срабатывает из-за разного регистра букв.

Кликните здесь для просмотра всего текста
P.S. В целом следует отметить пару моментов:

1) Подставлять строки прямо в запрос - опасная практика дающая злоумышленнику возможность провести атаку с помощью внедрения sql. Вместо этого следует использовать параметры.

2) Хорошо что ты хранишь в базе MD5-хеш пароля, но этот алгоритм устарел и не подходит для хеширования паролей. Кроме того к каждому паролю следует добавлять случайную соль чтобы повысить степень защиты и чтобы одинаковые пароли у разных пользователей имели разный хеш. Вместо MD5 лучше использовать современные специализированные алгоритмы такие как PBKDF2, bcrypt, scrypt. Смотри пример с использованием PBKDF2 в теме Система регистрации логин-пароль

3) Непонятно назначение цикла while (reader.Read()) - у тебя разве может быть несколько одинаковых логинов? - и назначение массива d.

4) Проверку логина, пароля на null логичнее поставить перед открытием соединения с БД чтобы не тратить зря время.
0
Кузнецов Михаил
0 / 0 / 2
Регистрация: 15.05.2015
Сообщений: 73
10.12.2016, 19:14  [ТС] 3
OwenGlendower, Однако, условие срабатывает, но переменная, почему-то присваиваться не желает и не собирается. Насчёт тех пунктов, которые были в сплойлере - спасибо, учту. Тем не менее, присвоить не получается.
0
OwenGlendower
Супер-модератор
Эксперт .NET
9324 / 8183 / 3491
Регистрация: 17.03.2014
Сообщений: 16,249
Записей в блоге: 1
10.12.2016, 19:17 4
Кузнецов Михаил, может потому что ты перезаписываешь значение credentials, а другая функция использует старое значение?
0
Кузнецов Михаил
0 / 0 / 2
Регистрация: 15.05.2015
Сообщений: 73
10.12.2016, 19:18  [ТС] 5
OwenGlendower, Хм. Пока что эта структура используется только здесь.
0
OwenGlendower
Супер-модератор
Эксперт .NET
9324 / 8183 / 3491
Регистрация: 17.03.2014
Сообщений: 16,249
Записей в блоге: 1
10.12.2016, 19:21 6
Кузнецов Михаил, покажи как вызывается Authorize и как делается проверка.
0
Кузнецов Михаил
0 / 0 / 2
Регистрация: 15.05.2015
Сообщений: 73
10.12.2016, 19:25  [ТС] 7
OwenGlendower:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
        public void OpenChat()
        {
            if (credentials.Authorized == false)
            {
                RegLoginForm rgf = new RegLoginForm(this);
                switch (rgf.ShowDialog(this))
                {
                    default:
                    {
                        if (rgf.auth)
                        {
                            if (Authorize(rgf.login, rgf.pass))
                            {
                                if (chat != null) return;
                                chat = new ChatForm(credentials);
                                chat.Show();
                            }
                        }
                        else
                        {
                            if (Register(rgf.login, rgf.pass, rgf.confpass, rgf.email, rgf.nickname))
                            {
                                if (Authorize(rgf.login, rgf.pass))
                                {
                                    if (chat != null) return;
                                    chat = new ChatForm(credentials);
                                    chat.Show();
                                }
                            }
                        }
                    } break;
                }
            }
            else
            {
                if (chat != null) return;
                chat = new ChatForm(credentials);
                chat.Show();
            }
        }
Добавлю, что switch работает исправно, т.е. по нажатию кнопки в другой форме всё срабатывает, к этому притензий нет в принципе.
0
OwenGlendower
Супер-модератор
Эксперт .NET
9324 / 8183 / 3491
Регистрация: 17.03.2014
Сообщений: 16,249
Записей в блоге: 1
10.12.2016, 20:20 8
Кузнецов Михаил, понятнее не стало. Раз ты говоришь что метод Authorize возвращает false хотя должен вернуть true, то проверь конструктор Credentials и пройдись пошагово по функции Authorize - может тогда стянет понятна причина.

Цитата Сообщение от Кузнецов Михаил Посмотреть сообщение
C#
1
2
3
4
5
switch (rgf.ShowDialog(this))
{
default:
...
}
Данная проверка не имеет смысла. Если писать так, то достаточно вызвать rgf.ShowDialog();. Если писать нормально, то двигаться дальше следует только в случае DialogResult.OK.
0
10.12.2016, 20:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2016, 20:20

Присвоить переменной значение системной даты
Надо присвоить значение даты, которое есть на компе (права внизу), в...

Как присвоить значение полю по имени? Класс статический
Здраствуйте! У меня есть статический класс Comm. Внутри него есть функция...

Присвоить значение одной формы Form1, форме Form2
Здравствуйте нужна помощь, вообщем есть две формы form1, form2. Form1 один...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru