检查Mysql数据库中的用户名和密码(C#)。

5

我最近几天一直在遇到问题。我正在制作一个具有用户名和密码的简单登录界面,并将所有信息存储在数据库中。我需要检查用户名和密码是否匹配,以及账户是否激活(0或1)。但是我一直无法正确地实现这个功能。非常感谢您提供帮助。

数据库Mysql

    private void loginButton_Click(object sender, EventArgs e)
        {
            AdamPanel blarg = new AdminPanel();
            string pass, user;
            string password = "";
            string username = "";

            user = usernameBox.Text;
            pass = passwordBox.Text;           
            DataSet bb = new DataSet();

            string connectionString = "datasource=stuff;database=users";
            MySqlConnection mysql = new MySqlConnection(connectionString);
            MySqlDataAdapter adapter = new MySqlDataAdapter();

            adapter.SelectCommand = new MySqlCommand("SELECT * FROM RegularUsers WHERE Username = '" + user + "' AND Password = '" + pass + "'", mysql);
            adapter.Fill(bb);

            if(bb.HasRows)
                blarg.Show();
            return 0;





        }

    }
}

仍然无法工作,有什么想法吗?

不确定您的问题具体是什么?您卡在哪里了? - Pekka
好的,添加了一个代码示例,有什么想法吗? - seandidk
你正在使用paSS和usER而不是this.username和this.password。paSS和usER从未填充用户的值。 - Highstead
这两个都不起作用,所以我打算尝试将它们放在loginButton_Click下面。 - seandidk
有人能帮忙吗?我还是不明白为什么这个不起作用。有人能帮我一步步走过这个吗? - seandidk
显示剩余2条评论
4个回答

2
首先,请对密码进行哈希和加盐处理。确保您的用户名/密码不易受 SQL 注入攻击,因为您没有使用具有参数化查询的语言……可能最好使用存储过程,因为我认为 MySql 现在已经支持它们了。
然而,尽管如此……我认为这就是您要找的内容。
public int Load()
    {
        string connectionString = "datasource=STUFF YOU SHOULDNT SEEdatabase=users";
        MySqlConnection mysql = new MySqlConnection(connectionString);
        MySqlDataAdapter adapter = new MySqlDataAdapter();

        mysql.SelectCommand = new MySqlCommand("SELECT * FROM [RegularUsers] WHERE Username = '" + this.username + "' AND Pass = '" + this.password + "'", conn);
        mysql.Fill(dataset);


        if (dataset.HasRows)
            return 1;
        return 0;
    }

1
  public bool ValidateLogin(string username, string password)
  {

    MySqlConnection conn = new MySqlConnection("[YOURCONNECTIONSTRING]");
    MySqlDataAdapter adapter = new MySqlDataAdapter();
    adapter.SelectCommand = new MySqlCommand("SELECT * FROM [YOURUSERTABLE] WHERE Username = ? AND Pass = ?", conn);

    adapter.SelectCommand.Parameters.Add("@Username", username);
    adapter.SelectCommand.Parameters.Add("@Password", password);

    adapter.Fill(dataset);


    If (dataset.HasRows)
    {
      // User is logged in maybe do FormsAuthentication.SetAuthcookie(username);
        return true;
    } else {
      // Authentication failed
      return false;
    }

  }

很好,现在我的问题是,不要将其放入数据集中,只需进行比较,然后返回1或0。 - seandidk
你可能需要考虑参数化查询,或者至少以某种方式对输入进行最小限度的净化,以避免在此处受到 SQL 注入攻击。... - Paul
保罗绝对正确,所以我添加了一些参数。不要忘记将 [YOURCONNECTIONSTRING] 和 [YOURUSERTABLE] 部分更改为您的代码。 - Matt Hudson
是的,我要对我的密码进行哈希和加盐处理,我只是在尝试连接并使数据库工作。 - seandidk
还有我需要使用哪个特定库才能使用“数据集(dataset)”呢?还是需要声明一个变量? - seandidk
需要使用 system.Data 才能使用 dataset 对象。 - Highstead

1

首先,您必须包含使用MySql.Data.MySqlClient。
使用以下函数:

public MySqlConnection NewConnection()
{
    string cstr = String.Format(
        "SERVER={0};PORT={1};DATABASE={2};UID={3};PWD={4}",
        sett.DBHost, sett.DBPort, sett.DBDatabase,
        HotelDB.user, HotelDB.password);
    MySqlConnection conn = new MySqlConnection(cstr);
    try { conn.Open(); }
    catch (Exception ex)
    {
        conn = null;
    }
    return conn;
}


private MySqlCommand NewCommand(MySqlConnection conn, string cmd, params object[] parameters)
{
    if (conn==null) return null;
    MySqlCommand command;
    try
    {
        command = new MySqlCommand(cmd, conn);
        if (parameters != null)
        {
            int index = 0;
            while (index < parameters.Length)
            {
                command.Parameters.Add(
                    new MySqlParameter((string)parameters[index], parameters[index + 1]));
                index += 2;
            }
        }
    }
    catch { command = null; }
    return command;
}

private string MD5(string Value)
{
        System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
        byte[] data = System.Text.Encoding.ASCII.GetBytes(Value);
        data = x.ComputeHash(data);
        string ret = "";
        for (int i=0; i < data.Length; i++)
                ret += data[i].ToString("x2").ToLower();
        return ret;
}

那么您可以这样做:

MySqlConnection conn = NewConnection(.....);
MySqlCommand cmd = NewCommand(conn,"SELECT userid,useractive FROM table WHERE username=@user AND MD5(password)=@pwd","user",username,"pwd",MD5(pwd));
MySqlDataReader rd = cmd.ExecuteReader();

其中username和pwd是用户输入的内容。 如果rd为空,则表示用户/密码错误;否则,您可以读取所需的字段。


1

我更改了一些变量,并尽可能地简化了它,而不是为文本框声明一个变量,我将其直接指向适配器:

private void button Click
{
    MySqlConnection mcon = new MySqlConnection("Yourconnection");
    MySqlDataAdapter adapter;
    DataTable table = new DataTable();

    adapter = new MySqlDataAdapter("Select * From database.table where Username = '" + textbox1.Text + "' and password = '" + textbox2.Text +  "'", mcon);
    adapter.Fill(table);
    if (table.Rows.Count <= 0)
    {
        //message something
    }
    else
    {
        //show main form
    }
}

您可能希望添加一些详细信息,说明您进行了哪些更改以及为什么进行更改。 - Fizz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接