WHERE Name='{NameInput.Text}' AND Password='{GetHashString(PasswordInput.Text)}'查询失效,LoginButton功能异常调试求助
问题诊断与修复方案
你的LoginButton逻辑出错的核心原因是用错了SQL执行方法,同时还存在SQL注入风险,具体拆解如下:
为什么原来的代码不工作?
ExecuteNonQuery()是专门用来执行INSERT/UPDATE/DELETE这类不返回结果集的SQL语句的,对于SELECT查询,它只会返回-1,而且不会因为查不到匹配数据就抛出异常——所以不管用户名密码是否正确,代码都会顺利走完try块,直接显示"Welcome...",永远进不了catch块。
修复步骤 & 优化后的代码
我给你调整了代码,解决了逻辑问题,同时补上了安全和稳定性的优化:
private void LoginButton_Click(object sender, System.EventArgs e) { // 改用参数化查询,彻底避免SQL注入风险 string selectQuery = "SELECT COUNT(*) FROM bank.user WHERE Name=@Name AND Password=@Password;"; MySqlCommand cmd; try { connection.Open(); cmd = new MySqlCommand(selectQuery, connection); // 给SQL参数赋值,避免字符串拼接的安全问题 cmd.Parameters.AddWithValue("@Name", NameInput.Text); cmd.Parameters.AddWithValue("@Password", GetHashString(PasswordInput.Text)); // 用ExecuteScalar获取匹配的用户数量(查询第一行第一列的值) int matchedUsers = Convert.ToInt32(cmd.ExecuteScalar()); if (matchedUsers > 0) { WarningLabel.Text = "Welcome " + NameInput.Text; } else { // 没有匹配到用户,说明账号或密码错误 WarningLabel.Text = "Wrong Name or Password"; } } catch (Exception ex) { // 捕获具体异常,方便调试(比如数据库连接失败等) WarningLabel.Text = "Login failed: " + ex.Message; } finally { // 用finally确保数据库连接一定会关闭,防止连接泄漏 if (connection.State == System.Data.ConnectionState.Open) { connection.Close(); } } }
关键优化点说明
- 替换执行方法:用
ExecuteScalar()来执行查询,它会返回查询结果的第一行第一列值(这里是匹配的用户数量),通过判断数量是否大于0来验证账号密码是否正确。 - 参数化查询:彻底避免了SQL注入攻击(比如用户输入
' OR '1'='1这类恶意内容会直接绕过原来的验证),同时也能避免特殊字符导致的SQL语法错误。 - finally块管理连接:不管代码是正常执行还是抛出异常,都会确保数据库连接被关闭,防止连接池耗尽的问题。
内容的提问来源于stack exchange,提问作者Nebula.EXE
相关产品推荐
相关产品推荐

