一般来说,我知道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));