一般来说,我知道 Linq to SQL 对于 SQL 注入是安全的,因为它正在使用SqlParameter(如此处和此处所述)。
但它看起来如何contains:
StreetRepository.Streets.Where(w => w.Streetname.Contains("Road"))
Run Code Online (Sandbox Code Playgroud)
如果我直接在 SQL Server 中记录查询,我可以看到使用了以下查询:
SELECT [Extent1].[Id] AS [Id], [Extent1].[Streetname] AS [Streetname]
FROM [dbo].[Streets] AS [Extent1]
WHERE [Extent1].[Streetname] LIKE N'%Road%'
Run Code Online (Sandbox Code Playgroud)
正如我们所看到的,它没有为这个查询使用参数。如果我使用以下命令:
StreetRepository.Streets.Where(w => w.Streetname.Contains("Road' OR 1=1"))
Run Code Online (Sandbox Code Playgroud)
我得到:
SELECT [Extent1].[Id] AS [Id], [Extent1].[Streetname] AS [Streetname]
FROM [dbo].[Streets] AS [Extent1]
WHERE [Extent1].[Streetname] LIKE N'%Road'' OR 1=1%'
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它由 double 转义''。
但这对所有攻击都足够安全吗?我可以放心使用 contains 吗?如果不是,我可以用什么代替contains?