【发布时间】:2014-02-05 16:18:03
【问题描述】:
我正在尝试使用 LINQ 创建动态 WHERE 子句。我有一个工作示例,但我担心 SQL 注入不安全。
以下 LINQ 代码:
var oQuery = _db.People.Where("FirstName.Contains(@0)", "kev");
产生以下 SQL:
SELECT
[Extent1].[FirstName] AS [[FirstName],
[Extent1].[LastName] AS [[LastName],
WHERE [Extent1].[[FirstName] LIKE '%kev%'
这很好用,但现在我也想使用动态列名。所以我想我会做以下事情:
var oQuery = _db.People.Where("@0.Contains(@1)", strSelectedColumn,"kev");
但这会产生以下 SQL:
SELECT
[Extent1].[FirstName] AS [[FirstName],
[Extent1].[LastName] AS [[LastName],
WHERE N'FirstName' LIKE N'%kev%'}
这显然是错误的并给出 0 行作为结果,因为他正在比较 2 个字符串。通过使用参数,LINQ 可能会在构建查询时将参数作为字符串注入,而不是在构建期间使用有效的列名。
解决方案是只使用以下 LINQ 查询:
var oQuery = _db.People.Where(strSelectedColumn + ".Contains(@0)", "kev");
但是这可能会导致不安全的 SQL,可以用来注入 SQL。
如何使用我的动态 LINQ 列并仍然获得安全代码?
【问题讨论】:
-
如何提供可供用户选择的字段名称?
-
他们不能真正动态选择,我用它来过滤网格中的列,我想在不同的页面上重新使用网格。
标签: entity-framework linq-to-entities sql-injection dynamic-linq