代码之家  ›  专栏  ›  技术社区  ›  theJ

防止API被SQL注入

  •  2
  • theJ  · 技术社区  · 6 年前

    我正在创建一个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");
    }
    

    存储库中的方法

        public IEnumerable<ApiStaff> GetStaffByName(string name)
        {
            var staffName = _context.ApiStaff.Where(k => k.FirstName == name);
            return staffName;
        }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Alex KeySmith    6 年前

    但从命名约定来看,您的问题不清楚您是否使用了诸如实体框架之类的ORM。 _context 还有LINQ查询的位置,我猜你在哪里。

    实际上,ASP.NET核心没有内置的SQL注入预防功能 Asp.net core does not have request validation built into it anymore .

    但是,使用 ORM has some natural SQL injection prevention :

    Linq to Entities注入攻击:

    尽管在LINQtoEntities中查询组合是可能的,但是 通过对象模型API执行。与实体SQL查询不同, Linq to Entities查询不是通过使用字符串操作组成的 或者连接,它们不受传统SQL的影响 注射攻击。

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

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

    用例的一个简单示例可以将名字约束为合理的值,例如不超过x个字符(30?)。没有数字等,不过说起来容易做起来难。 internationalization 因此,即使在实体框架中发现了一个弱点,您也只能给攻击者一个有限的字符集来攻击您,从而挫败攻击者。

    我建议你阅读 OWASP's cheat sheet