【问题标题】:Safe dynamic column name in dynamic LINQ动态 LINQ 中的安全动态列名
【发布时间】: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


【解决方案1】:

列名通常只包含字母,因此您可以对用户输入应用“哑”清理:

// user input: "abc';evil statement here"

strSelectedColumn = new string(strSelectedColumn.Where(c => char.IsLetter(c)).ToArray());
// abcevilstatementhere

var oQuery = _db.People.Where(strSelectedColumn + ".Contains(@0)", "kev");

【讨论】:

    【解决方案2】:

    这一行

    var oQuery = _db.People.Where(strSelectedColumn + ".Contains(@0)", "kev");
    

    生成安全的 SQL 代码,因为在生成 SQL 查询之前动态 linq 解析字符串表达式并创建表达式树。因此,如果在strSelectedColumn 中的列无效,则动态 linq 在生成 sql 查询之前引发解析异常。

    当你使用它时

    var oQuery = _db.People.Where("@0.Contains(@1)", strSelectedColumn,"kev");
    

    你得到

    WHERE N'FirstName' LIKE N'%kev%'
    

    因为你不检查字段的值,你尝试检查字符串参数的值。

    【讨论】:

    • 你有任何关于 LINQ 如何验证它是有效列的来源或链接吗?如果他们对字符串执行类似 IF exists... 之类的操作,那么您仍然可以使用不安全的 SQL
    • @KevinCloet,您可以在源代码DynamicLinq 中看到所有与解析有关的内容
    • @KevinCloet,简而言之,当尝试从该属性不存在的类中获取属性时,创建表达式树时会引发异常
    猜你喜欢
    • 2014-09-04
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-10
    相关资源
    最近更新 更多