图书馆APP登录表单问题及同库记录下Form1向Form2传值咨询
关于图书馆应用登录表单与跨窗体传值的解答
一、修复登录脚本的SQL注入风险
嘿,作为编程新手能写出登录功能已经很棒啦!不过你当前的登录代码存在非常严重的SQL注入风险——直接把用户输入拼接到SQL语句里,恶意用户可以构造特殊输入篡改你的SQL逻辑,甚至窃取或破坏数据库数据,得赶紧调整写法。
先看你原代码的问题部分:
SqlCommand cmd = new SqlCommand("select id_user,pwd_user from tb_user where id_user='" + userid.Text + "'and pwd_user='" + userpwd.Text + "'", con);
这是典型的不安全写法,下面是修复后的参数化查询写法,能彻底规避SQL注入:
string userid1 = userid.Text; string password1 = userpwd.Text; // 使用参数化查询,将用户输入作为参数传递而非直接拼接 SqlCommand cmd = new SqlCommand("select id_user,pwd_user from tb_user where id_user = @UserId and pwd_user = @Password", con); // 为SQL参数赋值 cmd.Parameters.AddWithValue("@UserId", userid1); cmd.Parameters.AddWithValue("@Password", password1); SqlDataAdapter da = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); da.Fill(dt); if (dt.Rows.Count > 0) { MessageBox.Show("登录成功!"); // 这里可以添加登录成功后的逻辑,比如跳转Form2并传递数据 } else { MessageBox.Show("账号或密码错误!"); }
额外提个小建议:实际项目里千万别明文存储密码,应该存储密码的哈希值(比如SHA256、BCrypt这类更安全的哈希算法),验证时把用户输入的密码哈希后再和数据库里的哈希值比对,能大幅提升账号安全性。
二、从Form1传递数据库记录值到Form2
下面给你几种WinForms中常用的跨窗体传值方法,你可以根据需求选择:
方法1:通过Form2的构造函数传值
这是最直观的方式,给Form2定义带参数的构造函数,打开Form2时直接把数据传进去:
// 在Form2中定义带参数的构造函数 public partial class Form2 : Form { private string _userId; private string _userName; // 示例:传递用户名字段 public Form2(string userId, string userName) { InitializeComponent(); _userId = userId; _userName = userName; // 可以直接把值绑定到Form2的控件上 lblUserId.Text = _userId; lblUserName.Text = _userName; } } // 在Form1登录成功后调用: if (dt.Rows.Count > 0) { MessageBox.Show("登录成功!"); // 从DataTable中取出记录值 string userId = dt.Rows[0]["id_user"].ToString(); string userName = dt.Rows[0]["user_name"].ToString(); // 替换成你实际的字段名 // 实例化Form2并传递参数 Form2 form2 = new Form2(userId, userName); form2.Show(); this.Hide(); // 可选:隐藏Form1 }
方法2:通过Form2的公共属性传值
如果不想修改构造函数,可以给Form2定义公共属性,打开Form2后再赋值:
// 在Form2中定义公共属性 public partial class Form2 : Form { public string UserId { get; set; } public string UserName { get; set; } public Form2() { InitializeComponent(); } // 在Form2的加载事件中使用属性值 private void Form2_Load(object sender, EventArgs e) { lblUserId.Text = UserId; lblUserName.Text = UserName; } } // 在Form1中调用: if (dt.Rows.Count > 0) { MessageBox.Show("登录成功!"); string userId = dt.Rows[0]["id_user"].ToString(); string userName = dt.Rows[0]["user_name"].ToString(); Form2 form2 = new Form2(); form2.UserId = userId; form2.UserName = userName; form2.Show(); }
方法3:使用静态类存储共享数据
如果需要在多个窗体之间共享数据,可以定义一个静态类来保存:
// 定义静态类存储用户信息 public static class UserSession { public static string UserId { get; set; } public static string UserName { get; set; } } // 在Form1登录成功后赋值: if (dt.Rows.Count > 0) { MessageBox.Show("登录成功!"); UserSession.UserId = dt.Rows[0]["id_user"].ToString(); UserSession.UserName = dt.Rows[0]["user_name"].ToString(); Form2 form2 = new Form2(); form2.Show(); } // 在Form2中直接使用静态类的属性: private void Form2_Load(object sender, EventArgs e) { lblUserId.Text = UserSession.UserId; lblUserName.Text = UserSession.UserName; }
内容的提问来源于stack exchange,提问作者Adonia
相关产品推荐
相关产品推荐

