-1
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();
        }
    }

从这个站点获得帮助后,我将其编码如下。从数据库记录中获取所有值并检查它是否与输入的用户名匹配,然后检查是否与记录的密码匹配。如果不是,则显示消息框。现在它工作正常。

4

1 回答 1

1

你的代码很危险。

它有几个安全问题。

您的代码不起作用的原因很简单:您尝试使用给定的用户名和密码从数据库中读取记录。如果用户名或密码不正确,则不会检索任何记录,因此while(reader.Read())永远不会执行。

如果您确实检索了记录,则比较用户名和密码是完全没有用的,它们将始终匹配,因为您只是从数据库中读取它们。

修复您的 SQL 注入问题,存储密码哈希而不是纯文本密码,并使用不同的算法来检查:

尝试使用给定的用户名和哈希密码从数据库中读取记录,如果未找到记录则返回错误,或者从数据库中读取仅使用用户名的记录并检查检索到的密码哈希。

在任何一种情况下,如果有任何错误,只需返回一般错误消息。不要提供有关它是错误的用户名或密码的信息。只需一个简单的“用户名或密码错误”就足够了。

于 2017-09-10T15:33:10.420 回答