检查数据库中的登录凭据

时间:2015-02-24 20:19:50

标签: c# mysql wpf

我将用户名和密码存储在MySql数据库中。我使用以下代码根据数据库中的数据验证凭据以进行登录。代码工作正常。我的问题是这是不好的做法,是否有更好的方法来做到这一点。

我的方法是连接到该数据库,在List中提取并存储这些信息,并将它们与来自文本框输入的用户输入进行比较。

//Extracting information from the database and storing it in a List
public void Login()
{
    MySqlCommand cmdReader;
    MySqlDataReader myReader;

    userQuery = "SELECT * FROM User";
    string name = "Name";
    string user = "UserName";
    string pw = "Password";

    string connString = "server=" + server + "; userid=" + userid + "; password=" + password + "; database=" + database;
    try
    {
        conn.ConnectionString = connString;
        conn.Open();
        cmdReader = new MySqlCommand(userQuery, conn);
        myReader = cmdReader.ExecuteReader();
        while (myReader.Read())
        {
            string tempUser, tempPassword;
            if (name != null)
            {
                tempUser = myReader.GetString(user);
                tempPassword = myReader.GetString(pw);
                users.Add(tempUser);
                passwords.Add(tempPassword);
            }
        }
        myReader.Close();

    }
    catch (Exception err)
    {
        MessageBox.Show("Not connected to server. \nTry again later.");
        Application.Current.Shutdown();
    }
}

//Comparing the List data with the users input from textbox1 and textbox2 to verify
private void btn1_Click(object sender, RoutedEventArgs e)
{
    for (int x = 0; x < users.Count; x++)
    {
        for (int y = 0; y < passwords.Count; y++)
        {
            if (users[x] == textbox1.Text && passwords[y] == textbox2.Text)
            {
                MessageBox.Show("Login successful");
            }
        }
    }
}

3 个答案:

答案 0 :(得分:5)

  1. 不要在数据库中以明文形式存储密码,存储它们的哈希值。见(Best way to store password in database
  2. 不是查询和检索所有用户,而是将特定的user namepassword发送到数据库并比较返回的结果。
  3. 作为旁注,请不要使用字符串连接来形成SQL查询,而是使用参数,例如:

    using (MySqlCommand cmd = new MySqlCommand("SELECT Count(*) FROM User = @userName AND password = @password"),conn)
    {
        cmd.Parameters.AddwithValue("@username", username);
        cmd.Parameters.AddwithValue("@password", password);
        ....
        var count = cmd.ExecuteScalar(); //and check the returned value
    }
    

    目前,您正在检索User表中的所有记录,然后将其与客户端的值进行比较,想象一下,如果您拥有大量用户,那么将大量数据提供给客户端是没有意义的。

答案 1 :(得分:1)

循环使用两个列表并比较索引不是最佳的 如果你想预先取一个字典 Dictionary上的键查找是O(1)

Dictionary<string,string> UserIDpw = new Dictionary<string,string>();
while (myReader.Read())
{
    UserIDpw.Add(myReader.GetString(0), myReader.GetString(1));
}

但Habib的答案是一种更好的方法。您没有性能问题需要您预取和预取问题。例如,你可以在网络服务器上获得密码更容易破解的密码。

答案 2 :(得分:0)

我会使用存储过程,然后发送用户名和密码作为参数。根据这是内网应用程序,还是互联网上的内容,我可能会像Habib建议的那样做哈希事件。