Member 12650438 Ответов: 2

Я использую backend SQL для доступа к базе данных для получения регистрационных данных, то есть имени пользователя и пароля, но без ввода того, что он войдет в систему


Вот мой код, в чем проблема.


private void button1_Click(object sender, EventArgs e)
       {
           SqlConnection con = new SqlConnection(@"Data Source=.;Database=master;Integrated Security=True");

           SqlDataAdapter sda = new SqlDataAdapter("SELECT * FROM Register WHERE usernmae='" + textBox1.Text + "' AND password='" + textBox2.Text + "'", con);
           /* in above line the program is selecting the whole data from table and the matching it with the user name and password provided by user. */
           con.Open();
           DataTable dt = new DataTable(); //this is creating a virtual table
           //sda.Fill(dt);
           con.Close();
           if (dt.Rows.Count >= 0)
           {
               /* I have made a new page called home page. If the user is successfully authenticated then the form will be moved to the next form */
               this.Hide();
               Dashboard  sn = new Dashboard();
               sn.Show();
               //new home().Show();
               //MessageBox.Show("done");
           }
           else
               MessageBox.Show("Not succesful Login");


Что я уже пробовал:

я хочу войти в систему с действительным именем пользователя и паролем, если он правильный, то он должен войти, если нет, то он должен показать ошибку, а не войти в систему.

Garth J Lancaster

Я думаю, что это" Integrated Security=True " в вашей строке подключения - он использует аутентификацию Windows/учетные данные вместо "учетных данных профиля базы данных/входа в систему"

Кстати, ваш SQL - отстой - никогда не стоит использовать конкатенацию для построения SQL-оператора, вы оставляете себя открытым для атак SQL-инъекций-вместо этого используйте параметризованный SQL-оператор

2 Ответов

Рейтинг:
1

OriginalGriff

Здесь есть несколько неправильных вещей:
1) Никогда не используйте жесткие строки кода подключения: они должны быть в конфигурационных файлах, потому что обычно они будут отличаться для разработки и производства: производство будет использовать серверную систему, к которой подключаются несколько машин с помощью идентификатора и пароля, разработка, если она часто выполняется на локальной установке с использованием LOCALHOST и интегрированной безопасности.
2) Никогда не объединяйте строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.
3) вероятно, ваш столбец базы данных SQL называется не "usernmae", а "username"
4) Никогда не храните пароли в открытом тексте - это серьезная угроза безопасности. Здесь есть некоторая информация о том, как это сделать: Хранение паролей: как это сделать.[^]
5) Если все, что вас интересует, - это количество строк, то используйте SELECT COUNT(*) и вызовите ExecuteScalar, чтобы вернуть одно значение, вместо того чтобы тратить время и ресурсы на создание таблиц данных, которые вы никогда не будете использовать.
6) подумайте о своих условиях:

if (dt.Rows.Count >= 0)

Если в БД нет совпадений, действительно ли это успешный вход в систему?


Рейтинг:
1

Patrice T

У вас есть много проблем в этом коде.
-Вы всегда успешно входите в систему из-за этого:

if (dt.Rows.Count >= 0)

, он говорит, что 0 принимается, и так как счет не может быть отрицательным ...
- Совет, вставь что-нибудь dt- так будет лучше.
- Совет, никогда не создавайте SQL-запрос таким образом
"SELECT * FROM Register WHERE usernmae='" + textBox1.Text + "' AND password='" + textBox2.Text + "'"

когда значения являются пользовательскими входными данными, это открывает дверь для SQL-инъекции
SQL-инъекция[^]

[Обновление]
Вы должны научиться использовать отладчик как можно скорее. Вместо того чтобы гадать, что делает ваш код, пришло время увидеть, как он выполняется, и убедиться, что он делает то, что вы ожидаете.

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик - Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html[^]
https://www.jetbrains.com/idea/help/debugging-your-first-java-application.html[^]

Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
Когда код не делает того, что ожидается, вы близки к ошибке.


Member 12650438

должен ли я сохранить значение в dt?

Patrice T

Нет никаких причин не делать этого.
Это ваш дизайн, вы тот, кто решает, как все пойдет.

Member 12650438

каков способ выйти из проблемы ведения журнала, то вы можете изменить код, который я представил.