C#如何从Microsoft Access数据库读取数据实现身份验证
问题修正及实现方案
现有代码存在以下核心问题:
- 数据访问类使用错误:
SqlDataAdapter是SQL Server专用的提供程序类,无法适配Access数据库,需替换为OleDb系列类,操作前需先引入命名空间using System.Data.OleDb; - 存在SQL注入风险:直接拼接用户输入的SQL语句会被恶意输入绕过验证,比如输入
' OR 1=1 --作为用户名即可无需密码登录,必须使用参数化查询处理输入值 - 额外安全隐患:代码中直接比对明文密码,数据库不应存储明文密码,建议存储加盐哈希后的密码字符串
修正后的实现代码如下:
private void btn_login_Click(object sender, EventArgs e) { string username = txt_loginusername.Text.Trim(); string password = txt_loginpassword.Text; // 参数化SQL语句,用?作为占位符(OleDb不支持命名参数,按顺序匹配参数) string sqlStr = "SELECT COUNT(*) FROM Users WHERE Username = ? AND UserPassword = ?"; // 使用OleDb系列类操作Access,using语法会自动释放连接资源 using (OleDbConnection conn = new OleDbConnection(Database.CONNECTION_STRING)) using (OleDbCommand cmd = new OleDbCommand(sqlStr, conn)) { // 按SQL占位符顺序添加参数 cmd.Parameters.AddWithValue("@Username", username); cmd.Parameters.AddWithValue("@Password", password); try { conn.Open(); // ExecuteScalar获取查询结果的第一行第一列,比填充DataTable更轻量高效 int matchCount = (int)cmd.ExecuteScalar(); if (matchCount == 1) { FrmMain mainForm = new FrmMain(); this.Hide(); mainForm.Show(); } else { MessageBox.Show("用户名或密码错误"); } } catch (Exception ex) { MessageBox.Show("登录验证出错:" + ex.Message); } } }
如果你坚持要使用DataAdapter的方式实现,仅需将
SqlDataAdapter替换为OleDbDataAdapter即可,原有逻辑可以正常运行。
建议后续优化密码存储逻辑:注册时对密码加盐后计算哈希值存入数据库,登录时对用户输入的密码执行相同计算后再和数据库存储的哈希值比对,避免明文密码泄露风险。
内容的提问来源于stack exchange,提问作者Xeocas
相关产品推荐
相关产品推荐

