【问题标题】:C# Linq to SQL is contains safe for sql injectionsC# Linq to SQL 包含安全的 sql 注入
【发布时间】:2021-02-04 09:52:11
【问题描述】:

通常我知道 Linq to SQL 对于 SQL 注入是安全的,因为它使用 SqlParameter(如 herehere 所解释的那样)。

但是contains 的情况如何:

StreetRepository.Streets.Where(w => w.Streetname.Contains("Road"))

如果我直接在 SQL Server 中记录查询,我可以看到使用了以下查询:

SELECT [Extent1].[Id] AS [Id], [Extent1].[Streetname] AS [Streetname] 
FROM [dbo].[Streets] AS [Extent1]  
WHERE [Extent1].[Streetname] LIKE N'%Road%'

我们可以看到它没有使用这个查询的参数。如果我使用以下命令:

StreetRepository.Streets.Where(w => w.Streetname.Contains("Road' OR 1=1"))

我明白了:

SELECT [Extent1].[Id] AS [Id], [Extent1].[Streetname] AS [Streetname] 
FROM [dbo].[Streets] AS [Extent1]  
WHERE [Extent1].[Streetname] LIKE N'%Road'' OR 1=1%'

在这种情况下,它被双 '' 转义。

但这对于所有攻击是否足够安全?我可以放心使用 contains 吗?如果不是,我可以用什么来代替contains

【问题讨论】:

  • @meysamasadi 你读过我的问题吗?您的链接没有回答我的任何问题。
  • 我知道你在说什么。但是 linq 降低了注入的风险。我测试了 Contains("Road' OR 1=1") 它是安全的
  • 这能回答你的问题吗? Will using LINQ to SQL help prevent SQL injection
  • 这与@meysamasadi 发布的链接相同......正如所有链接(发布在我的问题和你的问题中)中所述,他们谈到使用的参数,默认情况下是安全的。正如您在我的问题中看到的那样,生成的 SQL 命令没有任何参数 ==> 因为您的链接没有帮助,所以在不使用参数时没有关于安全性的解释。查看接受的答案,它解释了 LINQ 安全地转义了字符串。

标签: c# linq linq-to-sql sql-injection


【解决方案1】:

参数不仅是防止 SQL 注入的方法。 LINQ to SQL 知道如何正确转义字符串。所以别担心,一切都会好的。

无论如何,如果你喜欢参数,只需将字符串值放入局部变量:

var streetName = "Road";
StreetRepository.Streets.Where(w => w.Streetname.Contains(streetName));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    相关资源
    最近更新 更多