You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#从SQLite校验用户名密码时二次登录异常问题排查

问题分析与解决方案

你的问题核心在于登录校验的逻辑设计错误,同时还有一些潜在的代码风险,咱们一步步来拆解和修复:

核心问题1:独立查询用户名和密码的逻辑缺陷

你现在的代码是分开查询「是否存在该用户名」和「是否存在该密码」,但这两个查询完全独立——比如系统里有用户A(用户名foo,密码123)和用户B(用户名bar,密码456),当你输入foo和456时,两次查询都会返回非null值,这就会误判为登录成功;而你遇到的「第一次错第二次对仍弹错误」,本质也是这种拆分查询的逻辑漏洞导致的。

核心问题2:登录成功的判断用错逻辑运算符

你最后判断txtboxID.Text == id || txtboxPW.Text == pass,这意味着只要用户名或者密码匹配就会登录成功,完全不符合登录的核心逻辑——应该是两者同时匹配才对。

额外风险:严重的SQL注入漏洞

你的SQL语句直接拼接用户输入,这会导致恶意用户通过输入特殊字符篡改SQL语句,窃取或破坏数据库数据,必须改用参数化查询修复。

修正后的完整代码

下面是重构后的代码,解决了所有问题:

private void loginBtn_Click(object sender, EventArgs e)
{
    // 更严谨的空输入校验
    if (string.IsNullOrWhiteSpace(txtboxID.Text))
    {
        MessageBox.Show("Please enter your username..", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
    }
    if (string.IsNullOrWhiteSpace(txtboxPW.Text))
    {
        MessageBox.Show("Please enter your password..", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
    }

    // 使用using自动释放数据库资源,避免连接泄漏
    using (var connection = new SQLiteConnection("你的数据库连接字符串")) // 替换为你实际的连接字符串
    {
        connection.Open();
        // 单条SQL同时校验用户名和密码,确保是同一个用户的匹配
        string loginQuery = "SELECT COUNT(*) FROM user WHERE username = @Username AND password = @Password";
        using (var cmd = new SQLiteCommand(loginQuery, connection))
        {
            // 参数化查询,彻底避免SQL注入
            cmd.Parameters.AddWithValue("@Username", txtboxID.Text);
            cmd.Parameters.AddWithValue("@Password", txtboxPW.Text);
            
            // 执行查询,获取匹配的用户数量
            int matchedUserCount = Convert.ToInt32(cmd.ExecuteScalar());
            
            if (matchedUserCount > 0)
            {
                // 登录成功逻辑
                guverteBtn.Visible = true;
                makineBtn.Visible = true;
                loginBtn.Visible = false;
                logincontrolTxt.Text = "Login Successfully !";
                logincontrolTxt.ForeColor = Color.White;
                logincontrolTxt.Location = new Point(200, 393);
                regBTN.Visible = false;
                resetBTN.Visible = false;
                txtboxID.Text = "";
                txtboxPW.Text = "";
            }
            else
            {
                // 用户名或密码错误
                MessageBox.Show("wrong username or password", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                logincontrolTxt.Text = "Invalid ID or Password !";
                logincontrolTxt.Location = new Point(180, 393);
                logincontrolTxt.ForeColor = Color.Red;
                txtboxID.Text = "";
                txtboxPW.Text = "";
            }
        }
    }
}

关键改进点说明

  • 单条SQL校验:通过一次查询同时匹配用户名和密码,确保是同一个用户的正确组合,从根源解决逻辑漏洞。
  • 参数化查询:替代字符串拼接,彻底杜绝SQL注入风险。
  • 自动资源管理:用using包裹连接和命令对象,确保数据库资源自动释放,避免连接泄漏问题。
  • 简化逻辑判断:通过统计匹配用户数量来判断登录结果,逻辑更清晰易懂。
  • 严谨的空值处理:用string.IsNullOrWhiteSpace替代简单的空字符串判断,覆盖空格等无效输入场景。

这样修改后,不管是第一次输错还是后续输入正确,校验逻辑都会正常执行,不会再出现你遇到的错误提示残留问题。

内容的提问来源于stack exchange,提问作者Muhammed Sarıgül

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 02:52:40