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