不满足 if() 中的条件,但它不显示 MessageBox.show("");其他一切都很好
Don't meet the condition in if() but it dosen't show the MessageBox.show(""); Everything else works just fine
public partial class FormLogin : Form
{
private OleDbConnection connection = new OleDbConnection();
//private bool CheckUserName = false;
public FormLogin()
{
InitializeComponent();
connection.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Class\This Semester\C#\Code\Access Login App\Database1.accdb;Persist Security Info=False;";
}
private void Form1_Load(object sender, EventArgs e)
{
try
{
connection.Open();
DBCheckLabel.Text = "Connected";
connection.Close();
} catch(Exception ex)
{
MessageBox.Show("Error:" + ex);
}
}
private void log_in_btn_Click(object sender, EventArgs e)
{
try
{
OleDbCommand command = new OleDbCommand();
connection.Open();
command.Connection = connection;
command.CommandText = "select * from acctbl where Username=" + txt_bx_Username.Text + "and Password ='" + txt_bx_Password.Text + "';";
OleDbDataReader reader = command.ExecuteReader();
while (reader.Read())
{
string username = reader.GetValue(reader.GetOrdinal("UserName")).ToString();
string password = reader.GetValue(reader.GetOrdinal("Password")).ToString();
if (username.Equals(txt_bx_Username.Text))
{
if (password.Equals(txt_bx_Password.Text))
{
this.Hide();
FormProfile f1 = new FormProfile();
f1.Show();
}
else
MessageBox.Show("Incorrect Pass");
}
else
MessageBox.Show("Incorrect Username");
}
reader.Close();
connection.Close();
}
catch (Exception ex)
{
MessageBox.Show("Error: " + ex);
connection.Close();
}
}
}
这是登录页面的代码。如果用户名和密码正确,则转到下一步,但如果用户名或密码不匹配,则不在 else 块中显示消息。
private void log_in_btn_Click(object sender, EventArgs e)
{
try
{
OleDbCommand command = new OleDbCommand();
connection.Open();
command.Connection = connection;
command.CommandText = "select `UserName`, `Password` from acctbl;";
OleDbDataReader reader = command.ExecuteReader();
while (reader.Read())
{
string username = reader.GetValue(reader.GetOrdinal("UserName")).ToString();
string password = reader.GetValue(reader.GetOrdinal("Password")).ToString();
if (username.Equals(txt_bx_Username.Text))
{
if (password.Equals(txt_bx_Password.Text))
{
this.Hide();
FormProfile f1 = new FormProfile();
f1.Show();
}
else
{
MessageBox.Show("Incorrect Pass");
}
}
else
{
MessageBox.Show("Incorrect Username");
}
}
reader.Close();
connection.Close();
}
catch (Exception exbtn)
{
MessageBox.Show("Error" + exbtn);
connection.Close();
}
}
从该站点获得帮助后,我将其正确编码如下。从数据库记录中获取所有值并检查它是否与输入的用户名匹配,然后检查是否与记录的密码匹配。如果不是,则显示消息框。现在它工作正常。
你的代码很危险。
它有几个安全问题。
您的代码不起作用的原因很简单:您尝试使用给定的用户名和密码从数据库中读取一条记录。如果用户名或密码不正确,您不会检索任何记录,因此 while(reader.Read())
永远不会执行。
如果您检索记录,比较用户名和密码是完全没有用的,它们将总是匹配,因为您只是阅读他们来自数据库。
修复您的 SQL 注入问题,存储密码哈希而不是纯文本密码并使用不同的算法来检查:
尝试使用给定的用户名和散列密码从您的数据库中读取记录,如果没有找到记录则return出错,或者从中读取记录只有用户名的数据库检查检索到的密码哈希。
在任何一种情况下,如果有任何错误,只需 return 一条通用错误消息。不要泄露有关它是错误的用户名或密码的信息。一个简单的"incorrect username or password"就够了。
public partial class FormLogin : Form
{
private OleDbConnection connection = new OleDbConnection();
//private bool CheckUserName = false;
public FormLogin()
{
InitializeComponent();
connection.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Class\This Semester\C#\Code\Access Login App\Database1.accdb;Persist Security Info=False;";
}
private void Form1_Load(object sender, EventArgs e)
{
try
{
connection.Open();
DBCheckLabel.Text = "Connected";
connection.Close();
} catch(Exception ex)
{
MessageBox.Show("Error:" + ex);
}
}
private void log_in_btn_Click(object sender, EventArgs e)
{
try
{
OleDbCommand command = new OleDbCommand();
connection.Open();
command.Connection = connection;
command.CommandText = "select * from acctbl where Username=" + txt_bx_Username.Text + "and Password ='" + txt_bx_Password.Text + "';";
OleDbDataReader reader = command.ExecuteReader();
while (reader.Read())
{
string username = reader.GetValue(reader.GetOrdinal("UserName")).ToString();
string password = reader.GetValue(reader.GetOrdinal("Password")).ToString();
if (username.Equals(txt_bx_Username.Text))
{
if (password.Equals(txt_bx_Password.Text))
{
this.Hide();
FormProfile f1 = new FormProfile();
f1.Show();
}
else
MessageBox.Show("Incorrect Pass");
}
else
MessageBox.Show("Incorrect Username");
}
reader.Close();
connection.Close();
}
catch (Exception ex)
{
MessageBox.Show("Error: " + ex);
connection.Close();
}
}
}
这是登录页面的代码。如果用户名和密码正确,则转到下一步,但如果用户名或密码不匹配,则不在 else 块中显示消息。
private void log_in_btn_Click(object sender, EventArgs e)
{
try
{
OleDbCommand command = new OleDbCommand();
connection.Open();
command.Connection = connection;
command.CommandText = "select `UserName`, `Password` from acctbl;";
OleDbDataReader reader = command.ExecuteReader();
while (reader.Read())
{
string username = reader.GetValue(reader.GetOrdinal("UserName")).ToString();
string password = reader.GetValue(reader.GetOrdinal("Password")).ToString();
if (username.Equals(txt_bx_Username.Text))
{
if (password.Equals(txt_bx_Password.Text))
{
this.Hide();
FormProfile f1 = new FormProfile();
f1.Show();
}
else
{
MessageBox.Show("Incorrect Pass");
}
}
else
{
MessageBox.Show("Incorrect Username");
}
}
reader.Close();
connection.Close();
}
catch (Exception exbtn)
{
MessageBox.Show("Error" + exbtn);
connection.Close();
}
}
从该站点获得帮助后,我将其正确编码如下。从数据库记录中获取所有值并检查它是否与输入的用户名匹配,然后检查是否与记录的密码匹配。如果不是,则显示消息框。现在它工作正常。
你的代码很危险。
它有几个安全问题。
您的代码不起作用的原因很简单:您尝试使用给定的用户名和密码从数据库中读取一条记录。如果用户名或密码不正确,您不会检索任何记录,因此 while(reader.Read())
永远不会执行。
如果您检索记录,比较用户名和密码是完全没有用的,它们将总是匹配,因为您只是阅读他们来自数据库。
修复您的 SQL 注入问题,存储密码哈希而不是纯文本密码并使用不同的算法来检查:
尝试使用给定的用户名和散列密码从您的数据库中读取记录,如果没有找到记录则return出错,或者从中读取记录只有用户名的数据库检查检索到的密码哈希。
在任何一种情况下,如果有任何错误,只需 return 一条通用错误消息。不要泄露有关它是错误的用户名或密码的信息。一个简单的"incorrect username or password"就够了。