我正在尝试创建一个具有两个访问级别的登录系统。如果访问级别为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");
}
}
}
}
}
答案 0 :(得分:3)
您需要阅读有关SQL注入的信息。尝试添加文字
'或1 = 1 -
进入您的用户名文本框并尝试登录。您还应该考虑阅读内置的asp.net用户管理/角色 - 这是在这里为您提供良好服务的角色位。
来自ScottGu的良好链接:
http://weblogs.asp.net/scottgu/archive/2005/10/18/427754.aspx
答案 1 :(得分:3)
您的问题似乎是将cmd2
(ExecuteReader
的实例)与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");
}
}
}
}