【发布时间】:2021-02-04 09:52:11
【问题描述】:
通常我知道 Linq to SQL 对于 SQL 注入是安全的,因为它使用 SqlParameter(如 here 和 here 所解释的那样)。
但是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") 它是安全的
-
这与@meysamasadi 发布的链接相同......正如所有链接(发布在我的问题和你的问题中)中所述,他们谈到使用的参数,默认情况下是安全的。正如您在我的问题中看到的那样,生成的 SQL 命令没有任何参数 ==> 因为您的链接没有帮助,所以在不使用参数时没有关于安全性的解释。查看接受的答案,它解释了 LINQ 安全地转义了字符串。
标签: c# linq linq-to-sql sql-injection