使用C#搭配MS SQL数据库开发登录表单时大小写校验失效问题
问题根因
你遇到的大小写不敏感问题由SQL Server默认配置导致:
- 默认情况下SQL Server的排序规则(例如常用的
Chinese_PRC_CI_AS)中,CI标识代表大小写不敏感,字符串匹配时会自动忽略大小写差异,只要字符内容一致就会命中查询结果。 - 现有代码存在无效冗余操作:
ExecuteNonQuery()仅用于执行增/删/改语句返回受影响行数,你执行的是SELECT查询,此处调用完全无意义可以直接删除;同时SqlDataAdapter的Fill()方法会自动管理数据库连接的开闭,你手动编写的con.Open()、con.Close()逻辑也属于冗余代码。
解决方案
方案1:查询时强制区分大小写(无需修改库配置,改SQL语句即可生效)
在WHERE条件后追加COLLATE参数指定大小写敏感的排序规则,修改你的SQL查询语句为:
SqlCommand cmd = new SqlCommand("SELECT * FROM tblUser WHERE USERNAME=@USERNAME COLLATE Chinese_PRC_CS_AS AND PASSWORD=@PASSWORD COLLATE Chinese_PRC_CS_AS", con);
参数中的CS标识代表大小写敏感,执行查询时就会严格校验字符大小写是否完全匹配。
方案2:修改表字段排序规则(永久生效)
如果希望用户名、密码字段永久保持大小写敏感校验,直接修改表结构对应字段的排序规则即可:
ALTER TABLE tblUser ALTER COLUMN USERNAME VARCHAR(你实际定义的字段长度) COLLATE Chinese_PRC_CS_AS NOT NULL; ALTER TABLE tblUser ALTER COLUMN PASSWORD VARCHAR(你实际定义的字段长度) COLLATE Chinese_PRC_CS_AS NOT NULL;
安全提示
当前你采用明文存储密码的方式存在严重安全漏洞,生产环境必须做加密处理:
- 用户注册时将密码加盐后做哈希运算,将运算结果存入数据库,禁止存储明文密码
- 登录时将用户输入的密码做相同的加盐哈希运算后,再和数据库存储的哈希值做对比
内容的提问来源于stack exchange,提问作者MarkNeil
相关产品推荐
相关产品推荐

