保护 API 免受 SQL 注入

the*_*heJ 4 c# asp.net-core

我正在创建一个 API,下面的方法通过查询参数或所有员工中的姓名获取员工。但是,是否可以[FromQuery(Name = "name")]防止 SQL 注入,不确定这是否是 .NET core 2.2 的默认功能?

[HttpGet]
public IActionResult GetStaff([FromQuery(Name = "name")] string firstName)
{
    if (firstName == null)
    {
       //get all staff
       var staff = _repo.GetAllStaff().ToList();
       return Ok(staff);
    }

    if (firstName != null)
    {
       //get staff by firstName
       var staffByName = _repo.GetStaffByName(firstName).ToList();
       return Ok(staffByName);
    }

    return BadRequest("No staff found");
}
Run Code Online (Sandbox Code Playgroud)

存储库中的方法

    public IEnumerable<ApiStaff> GetStaffByName(string name)
    {
        var staffName = _context.ApiStaff.Where(k => k.FirstName == name);
        return staffName;
    }
Run Code Online (Sandbox Code Playgroud)

Ale*_*ith 7

从您的问题中不清楚您是否正在使用诸如实体框架之类的 ORM,但是从命名约定_context和 Where linq 查询来看,我猜您是。

ASP.net Core 没有内置 SQL 注入预防,实际上Asp.net Core 不再内置请求验证。

然而,使用ORM 有一些自然的 SQL 注入预防:

LINQ to Entities 注入攻击:

虽然查询组合在 LINQ to Entities 中是可能的,但它是通过对象模型 API 执行的。与 Entity SQL 查询不同,LINQ to Entities 查询不是通过使用字符串操作或连接来组成的,并且它们不易受到传统 SQL 注入攻击的影响。

如果您选择直接在 ORM 中执行 SQL,则情况并非如此,因此这取决于您如何使用它。

安全应被视为“深度防御”,在应用程序的每一层或边界添加缓解技术。

您的用例的一个简单示例可能是将名字限制为合理的值,例如不超过 X 个字符(30?),没有数字等,但是这对于国际化来说说起来容易做起来难,因此即使在实体中发现弱点框架,那么你就是在通过只给他们一个有限的字符集来攻击你来挫败攻击者。

我建议阅读OWASP 的备忘单