#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 при записи подключения к БД. Возможно возникновение исключения, и в этом случае ваше соединение останется открытым.
Вы также можете написать отдельный модуль для подключения к БД.