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

ASP.NET Core登录功能存在SQL注入漏洞,无需真实账号密码即可登录

解决ASP.NET Core登录功能的SQL注入漏洞问题

你贴的代码里用的是Entity Framework Core的Linq查询(FirstOrDefaultAsync(u => u.Email == model.Email)),这种参数化查询本身不会产生SQL注入。但你遇到输入' or 1=1--就能登录的情况,说明实际执行的逻辑和你贴的代码不符,大概率是密码验证环节或者用户查询环节存在手动拼接SQL的操作——比如PasswordHelper.VerifyPasswordHash内部直接把用户输入拼进了SQL,或者你实际查询用户时用了原生SQL拼接而非Linq。

修复步骤:

  • 排查并替换SQL拼接逻辑
    如果你用原生SQL查询用户,必须改用参数化查询,比如EF Core的FromSqlInterpolated(自动帮你做参数化):

    var user = await _context.Users
        .FromSqlInterpolated($"SELECT * FROM Users WHERE Email = {model.Email}")
        .FirstOrDefaultAsync();
    

    绝对不能手动拼接字符串,比如这种写法直接就给注入留了口子:

    // 错误写法!禁止使用
    var riskyQuery = $"SELECT * FROM Users WHERE Email = '{model.Email}'";
    
  • 确保密码验证逻辑正确
    你代码里的流程是对的:先通过邮箱查到用户,再在本地用哈希算法验证密码。但如果实际代码里是直接把密码拼进SQL做比对(比如WHERE Email = '{model.Email}' AND Password = '{model.Password}'),那必然会被注入。必须坚持先查用户,再本地验哈希的流程,而且密码必须是加盐哈希存储(绝对不能存明文)。

  • 额外安全加固

    • 开启EF Core的查询日志,查看实际生成的SQL,确认有没有未参数化的语句:
      // 在Program.cs里配置日志
      builder.Logging.AddFilter("Microsoft.EntityFrameworkCore.Database.Command", LogLevel.Information);
      
    • 给LoginViewModel的Email属性加[EmailAddress]特性,做格式验证,过滤非法输入;
    • 限制登录失败次数,防止暴力破解和注入尝试;
    • 所有传入数据库的参数必须用参数化方式处理,永远不要手动拼接用户输入。

内容的提问来源于stack exchange,提问作者Dinal Bhimani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:57:35