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

Pho*_*iex 5 c# linq sql-injection linq-to-sql

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

Svy*_*liv 2

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

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

var streetName = "Road";
StreetRepository.Streets.Where(w => w.Streetname.Contains(streetName));
Run Code Online (Sandbox Code Playgroud)