【问题标题】:EF Core raw query with Like clause带有 Like 子句的 EF Core 原始查询
【发布时间】:2020-06-08 16:32:21
【问题描述】:

我想使用允许我使用 Like 子句的 EF FromSqlInterpolated 或 FromSqlRaw 创建查询,但我不知道在不将应用程序打开到 SqlInjection 攻击的情况下执行此操作的正确方法是什么。 第一种方法将我带到以下代码

var results = _context.Categories.FromSqlInterpolated(
$"Select * from Category where name like {"%" + partialName + "%"}");

第一次测试运行良好,它在提供预期字符串时返回结果,当我提供类似 ';select * from Category Where name='Notes'--%'; 的内容时不返回任何内容 我仍然对 SqlInjection 知之甚少,至少对于前面显示的查询还不够安全。 有人知道查询是否安全,或者是否有正确的方法吗? 谢谢

【问题讨论】:

  • FromSqlInterpolated 应该参数化您的参数属性。来自the doc:您提供的任何插值参数值都将自动转换为 DbParameter
  • @ESG 所以这意味着它是安全的?我使用日志尝试查看最终的Sql,但我得到的结果是Select * from Category where name like @p0,这不是最终查询
  • 我想我上一个问题的答案是肯定的,一旦它是一个参数,stackoverflow.com/questions/23256298/… 是安全的
  • @Juan,语法保持不变,无论您使用哪种方法,您都需要用% 字符包装sql 参数或插值以使其工作。

标签: entity-framework .net-core sql-injection


【解决方案1】:

来自this document

FromSqlInterpolated 和 ExecuteSqlInterpolated 方法允许使用 防止 SQL 注入攻击的字符串插值语法。

var results = _context.Categories.FromSqlInterpolated(
$"Select * from Category where name like {"%" + partialName + "%"}");

或者您也可以像这样将查询更改为 Linq-to-Entity

var results = _context.Categories.Where(p => p.name.Contains(partialName ));

【讨论】:

  • 是的,正如我在答案中提到的,防止 SQL 注入攻击
  • 第二种解决方案不是我想要的,感谢您的帮助,但我分享的示例是对实际查询的简化。我想学习技术,而不是特定的查询
猜你喜欢
  • 1970-01-01
  • 2012-02-12
  • 2013-07-09
  • 1970-01-01
  • 2021-01-07
  • 2012-06-10
  • 1970-01-01
  • 2019-06-16
  • 1970-01-01
相关资源
最近更新 更多