Member 11138129 Ответов: 1

Как выглядят мои регистрационные коды?


А ты как думаешь? Как, по-вашему, я должен его улучшить? Спасибо, кто может помочь!
Код:
private static SqlConnection conn = new SqlConnection("Data Source = '" + Connection.Server + "'; Database = '" + Connection.DB + "'; User ID = '" + Connection.SQLUsername + "'; Password = '" + Connection.SQLPass + "'");
        private static SqlCommand login;
        private static SqlDataReader rdr;
        private string user, pass, type;
        private readonly Login lf;

        public FormLogin(Login loginform) {
            this.lf = loginform;
        }

public void sqlLogin() {
            user = Login.user;
            pass = Login.pass;

            try {
                string cmd = "select Username, Password, Acct_Type from User_Accounts where Username=@user and Password=@pass";
                using (login = new SqlCommand(cmd, conn)) {
                    login.Parameters.AddWithValue("@user", user);
                    login.Parameters.AddWithValue("@pass", pass);
                    conn.Open();
                    rdr = login.ExecuteReader();
                    if (rdr.HasRows == true) {
                        while (rdr.Read() == true) {
                            getData();

                            if (type == "Administrator") {
                                //Show the admin form
                                hideForm();
                            } else {
                                //Show the user form
                                hideForm();
                            }
                        }
                    }
                }
            } catch (Exception) {
                MessageBox.Show("Error in server configuration", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            } finally {
                if (rdr != null) {
                    rdr.Close();
                }
                if (conn.State == ConnectionState.Open) {
                    conn.Close();
                }
            }
        }

        private void getData() {
            user = rdr.GetString(0);
            pass = rdr.GetString(1);
            type = rdr.GetString(2);
        }

        private void hideForm() {
            Login.signin.Hide();
            lf.txtUsername.Text = "";
            lf.txtPassword.Text = "";
        }


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

Я попытался использовать get-set, но в настоящее время это сбивает меня с толку. :\

Richard MacCutchan

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

1 Ответов

Рейтинг:
2

OriginalGriff

Это нехорошо. Вы делаете там много гадостей.
Во-первых, вы используете переменные класса для вещей, которые должны быть локальными: ваше соединение и читатель. Хуже того, они static!
Вы используете using блок для вашей команды, но вручную закрывающий считыватель.
Вы делаете неуместные тесты:

if (rdr.HasRows == true) {
    while (rdr.Read() == true) {
Так вы сравните значение, которое уже булевую переменную с фиксированной логикой? Просто сказать:
if (rdr.HasRows) {
    while (rdr.Read()) {
Это гораздо легче читать.
Вы используете цикл на вашем читателе, когда должна быть - по определению-только одна совпадающая строка. Если их два, значит, с вашими данными что-то серьезно не так!
Вы ловите все исключения (что не рекомендуется), а затем сообщаете об этом как об одной ошибке в конфигурации, прежде чем отбросить всю информацию, которая может помочь вам диагностировать проблему.
Во всем коде есть два комментария: и они избыточны и вводят в заблуждение.
Вы указали столбцы, которые извлекаете из своей БД, - что хорошо, - но вы извлекаете информацию, которая у вас уже есть, и получаете доступ к данным с помощью числовых индексов другим методом, поэтому любые изменения, которые вы вносите, должны быть в двух разных местах.

Но самое худшее - это весь ваш процесс: хранить пароли в тексте-очень плохая идея. Криминальный Кодекс 1[^]
Вы можете посмотреть здесь: Хранение паролей: как это сделать.[^]