C# Linq to SQL 包含安全的 sql 注入

C# Linq to SQL is contains safe for sql injections

一般来说,我知道 Linq to SQL 对于 SQL 注入是安全的,因为它使用 SqlParameter(如 here and also here 所述)。

但是 contains 看起来如何:

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

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

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?

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

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

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