登录不区分大小写

时间:2014-02-22 15:58:18

标签: c# mysql winforms login

我应该怎么做才能使这个案例敏感?

当我在不同情况下使用输入尝试此代码但使用相同的用户名和密码拼写时,它仍会登录。我的字段在数据库中都是 varchar

if (user_txt.Text != "" & pass_txt.Text != "")
{
    string queryText = "SELECT Count(*) FROM stiguidancesample.users " + "WHERE username = @Username AND password = @Password";
    MySqlConnection cn = new MySqlConnection(MyConnectionString);
    MySqlCommand cmd = new MySqlCommand(queryText, cn);

    {
        cn.Open();
        cmd.Parameters.AddWithValue("@Username", user_txt.Text);  // cmd is SqlCommand 
        cmd.Parameters.AddWithValue("@Password", pass_txt.Text);
        int result = Convert.ToInt32(cmd.ExecuteScalar());
        if (result > 0)
            MessageBox.Show("Loggen In!");
        else
            MessageBox.Show("User Not Found!");
    }
}

3 个答案:

答案 0 :(得分:0)

我不知道所有数据库是否相同,但在比较文本相等性时,SQL Server和MySQL显然都不区分大小写。那应该是登录。用户输入用户名的情况无关紧要;它应该仍然匹配。

至于密码,你不应该直接保存它,所以它无关紧要。您应该散列密码并存储密码。任何人输入密码值的可能性都会导致包含相同字符的文本与您存储在数据库中的哈希在不同的情况下相同。

要进行扩展,您可以在用户注册时对密码进行哈希处理并保存结果,然后在登录时对您提供的密码进行哈希处理,并将其与数据库中的值进行比较。如果哈希值匹配,则认为密码匹配。

答案 1 :(得分:0)

排序规则与字符串的比较方式相关。 参见例如这个答案在这里: How can I make SQL case sensitive string comparison on MySQL?

或阅读此处的手册:http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html

答案 2 :(得分:0)

您的代码应如下所示

if (user_txt.Text != "" & pass_txt.Text != "")
{
    string queryText = "SELECT Count(*) FROM stiguidancesample.users " +  "WHERE       username = @Username AND password = @Password COLLATE SQL_Latin1_General_CP1_CS_AS ";
MySqlConnection cn = new MySqlConnection(MyConnectionString);
MySqlCommand cmd = new MySqlCommand(queryText, cn);

  {
    cn.Open();
    cmd.Parameters.AddWithValue("@Username", user_txt.Text);  // cmd is SqlCommand 
    cmd.Parameters.AddWithValue("@Password", pass_txt.Text);
    int result = Convert.ToInt32(cmd.ExecuteScalar());
    if (result > 0)
        MessageBox.Show("Loggen In!");
    else
        MessageBox.Show("User Not Found!");
  }
}

添加

  

COLLATE SQL_Latin1_General_CP1_CS_AS

在查询文本中的@Password之后。