регистрационная форма входа в систему c # регистрирует данные пользователя только 1 раз

#c# #forms #registration

#c# #формы #Регистрация

Вопрос:

Я создал регистрационную форму пользователя c # с шифрованием md5… Но моя проблема в том, что я хочу зарегистрировать данные пользователя на «Уровне администратора» только один раз..

Чего я хочу, так это когда я выбираю уровень администратора и пытаюсь повторно зарегистрироваться как другой пользователь, система может не дать разрешения на регистрацию другого администратора .. и показывает окно сообщения как «Извините, администратор уже зарегистрировался в системе»…

мой код……..

 if (textBox1.Text != "" amp;amp; textBox2.Text != "" amp;amp; comboBox1.Text != "" amp;amp; (comboBox1.Text == "Administrator" || comboBox1.Text == "Employee" || comboBox1.Text == "Developer"))
        {

            connection.Open();
            string TypeUser;
            int level = Convert.ToInt32(0);

            TypeUser = comboBox1.Text;

            if (TypeUser == "Administrator")
            {
                level = 1;

            }
            else if (TypeUser == "Employee")
            {
                level = 2;

            }
            else if (TypeUser == "Developer")
            {
                level = 3;

            }


            MySqlDataReader dr;
            MySqlCommand cmd;
            string sql = "INSERT INTO users(name,password,level) VALUES('"   textBox1.Text   "',MD5('"   textBox2.Text   "'),'"   level   "')";
            cmd = new MySqlCommand();
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = sql;
            cmd.Connection = connection;
            dr = cmd.ExecuteReader();

            MessageBox.Show("Registration Success !","Success",MessageBoxButtons.OK,MessageBoxIcon.Information);
            connection.Close();
            cmd.Dispose();
        }

        else
        {
            MessageBox.Show("All Fields must be required / something is wrong", "error", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error);
        }
  

Комментарии:

1. Простого использования хэш-функции недостаточно, и простое добавление соли мало что делает для повышения безопасности. Вместо этого я выполняю перебор HMAC со случайной солью продолжительностью около 100 мс и сохраняю соль с хэшем. Используйте такие функции, как PBKDF2 , password_hash , Bcrypt и аналогичные функции. Смысл в том, чтобы заставить злоумышленника потратить много времени на поиск паролей методом перебора. Защита ваших пользователей важна, пожалуйста, используйте безопасные методы ввода пароля.

Ответ №1:

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

 public bool CheckForExistingAdmin(int level)
{
    if(level != 1)
       return false;

     int count = 0;

     using(MySqlConnection conn = new MySqlConnection ("ConnectionString")
     {
         conn.Open();

         MySqlCommand cmd = new MySqlCommand();
         cmd.Connection = conn;
         cmd.CommandText = @"SELECT Count(ID) FROM Users WHERE Level = 1";

         count = (int)cmd.ExecuteScalar();

      }

      return count > 0 ? true : false;
}
  

После этого в вашем коде:

 if(CheckForExistingAdmin)
{
    //show error message;
    return; //exit from the method;
}

MySqlDataReader dr;
MySqlCommand cmd;
//other stuff.
  

У вас есть некоторые существенные проблемы с вашим кодом. Сначала вы открыты для внедрения sql. Для защиты следует использовать параметризованные запросы. Как я показываю в своем примере, также используйте using block или try / catch / finally при записи подключения к БД. Возможно возникновение исключения, и в этом случае ваше соединение останется открытым.

Вы также можете написать отдельный модуль для подключения к БД.