ASP.NET Core MVC对接PostgreSQL实现登录认证的SQL语句问题
问题排查与修复方案
现有代码的核心问题
- 存在SQL注入风险:直接通过
String.Format拼接用户提交的seller_email到SQL语句,攻击者可构造特殊输入绕过验证甚至窃取、篡改全库数据。 - 查询方法调用错误:
ExecuteNonQuery()仅适用于INSERT/UPDATE/DELETE等写操作,执行SELECT查询时该方法固定返回-1,原有判断逻辑完全无法生效。 - 建议补充密码校验逻辑:虽然当前需求只校验账号是否存在,但实际登录场景建议补充密码校验,避免权限泄露,注意密码需存储加盐哈希值,禁止明文存库。
修复后的代码实现
public IActionResult Login(string seller_email, string seller_password) { // 先校验入参非空,避免无效查询 if(string.IsNullOrWhiteSpace(seller_email)) { return View(nameof(Create)); } using var connection = new NpgsqlConnection(connString); connection.Open(); // 使用参数化查询,完全避免SQL注入风险 const string main_query = @"select exists(select 1 from public.""sellers"" where ""seller_email"" = @Email)"; using var command_main = new NpgsqlCommand(main_query, connection); // 给SQL参数赋值 command_main.Parameters.AddWithValue("@Email", seller_email); // ExecuteScalar返回查询结果第一行第一列的值,此处就是exists返回的布尔值 var userExists = (bool)command_main.ExecuteScalar(); if (userExists) { // 账号存在,跳转到Sign视图 return View(nameof(Sign)); } else { // 账号不存在,跳转到Create视图 return View(nameof(Create)); } }
逻辑说明
- 参数化查询会自动处理输入的特殊字符,完全杜绝SQL注入问题,是数据库查询的标准实现方式。
exists查询本身性能最优,只要匹配到一条符合条件的数据就会停止扫描,不需要读取整行数据。- 若后续需要补充密码校验,只需扩展WHERE条件增加密码哈希值匹配即可。
内容的提问来源于stack exchange,提问作者kiran
相关产品推荐
相关产品推荐

