具有两个访问级别的登录系统

时间:2011-03-15 15:00:23

标签: c#

我正在尝试创建一个具有两个访问级别的登录系统。如果访问级别为1,则他们会收到“护理者主页”,如果级别为2,则会收到“管理员页面”。登录表单有一个变量,用于根据数据库中的凭据验证用户名和密码,当用户单击按钮并且tryLogin变量返回true时,访问级别取自数据库中的用户名与用户名文本匹配的数据库字段

而不是加载消息无效登录凭据显示的任何表单。我花了很长时间研究这个并且输了,我希望这足以解释这个问题。

public bool tryLogin(string uname, string pword)
        {
            MySqlConnection con = new MySqlConnection("host="";user="";password=""; database="";");
            MySqlCommand cmd = new MySqlCommand("SELECT * FROM Staff WHERE username = '" + uname + "' AND password ='" + pword + "';");
            cmd.Connection = con;
            con.Open();
            MySqlDataReader reader = cmd.ExecuteReader();



            if (reader.Read() != false)
            {
                if (reader.IsDBNull(0) == true)
                {
                    cmd.Connection.Close();
                    reader.Dispose();
                    cmd.Dispose();
                    return false;
                }
                else
                {
                    cmd.Connection.Close();
                    reader.Dispose();
                    cmd.Dispose();
                    return true;
                }
            }
            else
            {

                return false;

            }
        }



private void LoginBT_Click(object sender, EventArgs e)
        {


            if (tryLogin(uname.Text, pword.Text) == true)
            {
                MySqlConnection con = new MySqlConnection("host="";user="";password=""; database="";");
                MySqlCommand cmd2 = new MySqlCommand("SELECT access_level FROM Staff WHERE username = '" + uname + "';");

                cmd2.Connection = con;
                con.Open();


                MySqlDataReader reader = cmd2.ExecuteReader();

                if (cmd2.Equals("1"))

                {
                    this.Hide();
                    CarerHomePage CarerHomePage = new CarerHomePage();
                    CarerHomePage.Show();
                }

                if (cmd2.Equals("2"))
                {
                    this.Hide();
                    AdministratorHome AdministratorHome = new AdministratorHome();
                    AdministratorHome.Show();

                }


                else
                {
                    MessageBox.Show("Invalid Login Credentials");
                }



            }

        }

    }
}

5 个答案:

答案 0 :(得分:3)

您需要阅读有关SQL注入的信息。尝试添加文字

'或1 = 1 -

进入您的用户名文本框并尝试登录。您还应该考虑阅读内置的asp.net用户管理/角色 - 这是在这里为您提供良好服务的角色位。

来自ScottGu的良好链接:

http://weblogs.asp.net/scottgu/archive/2005/10/18/427754.aspx

答案 1 :(得分:3)

您的问题似乎是将cmd2ExecuteReader的实例)与string进行比较。为什么这应该是真的?您应该检查查询结果而不是查询命令。

此外,即使CarrerHomePage已加载,您的if语句也会显示消息框。你应该这样试试:

            if (cmd2.Equals("1"))
            {
                this.Hide();
                CarerHomePage CarerHomePage = new CarerHomePage();
                CarerHomePage.Show();
            }
            else if (cmd2.Equals("2"))
            {
                this.Hide();
                AdministratorHome AdministratorHome = new AdministratorHome();
                AdministratorHome.Show();

            }
            else
            {
                MessageBox.Show("Invalid Login Credentials");
            }

答案 2 :(得分:1)

是的,这里有很多问题。您应该始终使用参数化查询。

问题是您使用的是cmd.Equals而不是使用DataReader来检索结果行。

如果您只想检索单个值,则可以使用ExecuteScalar。我建议非常彻底地阅读MySqlCommand上的Doc。

最后,您可以使用块包装对象...这将自动关闭并处理您的选项。缩短代码

public bool tryLogin(string uname, string pword)
{
    using(MySqlConnection con = new MySqlConnection("host="";user="";password=""; database="";"))
    using(MySqlCommand cmd = new MySqlCommand("SELECT * FROM Staff WHERE username = @name AND password = @pwd;"))
    {
        cmd.Parameters.AddWithValue("@name", uname);
        cmd.Parameters.AddWithValue("@pwd", pword);
        cmd.Connection = con;
        cmd.Connection.Open();            
        using(var reader = cmd.ExecuteReader())
        {
            return reader.Read() && !reader.IsDBNull(0));                
        }
    }
}



private void LoginBT_Click(object sender, EventArgs e)
{
    if (tryLogin(uname.Text, pword.Text))
    {
        using(MySqlConnection con = new MySqlConnection("host="";user="";password=""; database="";"))
        using(MySqlCommand cmd2 = new MySqlCommand("SELECT access_level FROM Staff WHERE username = '" + uname + "';"))
        {
            cmd2.Connection = con;
            cmd2.Connection.Open();                

            using(MySqlDataReader reader = cmd2.ExecuteReader())
            {
                if(reader.Read())
                {
                    var accessLevel = reader.GetInt32("access_level");
                    switch(accessLevel)
                    {
                        case 1:
                            this.Hide();
                            CarerHomePage CarerHomePage = new CarerHomePage();
                            CarerHomePage.Show();
                            break;
                        case 2:
                            this.Hide();
                            AdministratorHome AdministratorHome = new AdministratorHome();
                            AdministratorHome.Show();
                            break;
                        default:
                            MessageBox.Show("Invalid Login Credentials");
                            break;
                    }
                }
            }
        }
    }

}

答案 3 :(得分:1)

还有很大的改进空间,但我们只考虑明显错误的原因。

让你忙碌的问题是你将SQL命令的执行结果与命令本身进行比较

MySqlDataReader reader = cmd2.ExecuteReader();
if (cmd2.Equals("1")) // What the fail?

我认为你的意思是:

object accessCode = cmd2.ExecuteScalar();
if (accessCode != null && accessCode != DBNull.Value)
{
    if (accessCode.ToString() == "1")
    {
       this.Hide();
       CarerHomePage CarerHomePage = new CarerHomePage();
       CarerHomePage.Show();
    }

答案 4 :(得分:0)

好的,如果凭据错误,我可以确认try login bool正常工作 消息框显示。但是,如果我的凭据是正确的,无论我在access_level中放置什么,都不会加载任何表单。它慢慢地到了那里,我正在阅读一些关于使用调试器的教程,因为我仍然很新。

private void LoginBT_Click(object sender,EventArgs e)         {

        if (tryLogin(uname.Text, pword.Text) == true)
        {
            using (MySqlConnection con = new MySqlConnection("host="";user="";password=""; database="";"))
            using (MySqlCommand cmd2 = new MySqlCommand("SELECT access_level FROM Staff WHERE username = '" + uname + "';"))
            {

                cmd2.Connection = con;
                con.Open();


                object access_level = cmd2.ExecuteScalar();

                if (access_level != null && access_level != DBNull.Value)
                {
                    if (access_level.ToString() == "1")
                    {
                        this.Dispose();
                        CarerHomePage CarerHomePage = new CarerHomePage();
                        CarerHomePage.Show();
                    }


                    else if (access_level.ToString() == "2")
                    {
                        this.Dispose();
                        AdministratorHome AdministratorHome = new AdministratorHome();
                        AdministratorHome.Show();
                    }




                }

            }



        }
        else
        {
            MessageBox.Show("Invalid Login Credentials");
        }
}

}

}