【发布时间】:2016-05-30 18:59:21
【问题描述】:
在 Web 应用程序中,我从 ViewModel 以 List<string> 的形式获取用户输入,并使用此信息通过以下代码选择用户的 Id:
var selectedUsersIds = Context.Users
.Where(user => SelectedUsers.Contains(user.Email))
.Select(user => user.Id)
.ToList();
SelectedUsers 是字符串列表(用户电子邮件)。
现在,在查看应用程序日志时,我遇到了以下日志条目:
info: Microsoft.Data.Entity.Storage.Internal.RelationalCommandBuilderFactory[1]
Executed DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT [user].[Id]
FROM [AspNetUsers] AS [user]
WHERE [user].[Email] IN ('first@user.com', 'second@user.com')
所以接下来的任务是使用一个rest客户端并使用some@user'--作为表单参数,我得到了这个结果:
info: Microsoft.Data.Entity.Storage.Internal.RelationalCommandBuilderFactory[1]
Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT [user].[Id]
FROM [AspNetUsers] AS [user]
WHERE [user].[Email] IN ('some@user''--')
在这里,single ' 被转义为 double ''。这种行为似乎与
what is described in the docs under "Security Guarantee: LINQ queries use parameterization and escaping",表示查询将被参数化或转义。
但是,我想知道,查询何时参数化以及何时转义值是如何决定的?有什么理由选择其中之一? 而且我认为逃跑从来都不是 100% 安全的,现在情况不同了吗?
【问题讨论】:
标签: c# sql linq asp.net-core entity-framework-core