You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 11:27:03