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]特性,做格式验证,过滤非法输入; - 限制登录失败次数,防止暴力破解和注入尝试;
- 所有传入数据库的参数必须用参数化方式处理,永远不要手动拼接用户输入。
- 开启EF Core的查询日志,查看实际生成的SQL,确认有没有未参数化的语句:
内容的提问来源于stack exchange,提问作者Dinal Bhimani
相关产品推荐
相关产品推荐

