c# Linq to SQL包含安全的SQL注入



一般来说,我知道Linq to SQL对于SQL注入是安全的,因为它使用SqlParameter(如这里和这里所解释的)。

但是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?

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

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

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

最新更新