在实体框架中将字符串转换为FormattableString

问题描述 投票:0回答:3

我正在尝试使用 ASP.NET API 构建一个容易受到 SQL 注入攻击的网站(用于教育目的)。为此,我想使用之前准备好的 SQL 查询来调用

FromSql
,如下所示:

String query = "SELECT * FROM users WHERE email = '"+email
                  +"' AND password = '"+password+"'";
return RepositoryContext.Users.FromSql(query).FirstOrDefault();

但是这段代码不会编译,因为

FromSql
期待的是
FormattableString
,而不是
String
。我收到以下错误消息:

错误 CS1503 参数 2:无法从 'string' 转换为 'System.FormattableString'

以下内容将编译,但是此代码将不再容易受到 SQL 注入的攻击,因为实体框架将执行准备好的 SQL 查询并将电子邮件和密码转换为 SQL 查询参数:

return RepositoryContext.Users.FromSql(
   $"SELECT * FROM users WHERE email = {email} 
                           AND password = {password}").FirstOrDefault();

有没有办法将

String
转换为
FormattableString

谢谢您的帮助。

c# entity-framework asp.net-web-api formattablestring
3个回答
3
投票

使用 System.Runtime.CompilerServices;

...

var s = "...";
var fs = FormattableStringFactory.Create(s);

1
投票

您看到的是实体框架默认在防止 SQL 注入方面做得很好。

您可以使用 FromSqlRaw 方法来教授 SQL 注入,该方法采用可能被恶意制作的字符串。

另请参阅 Entity Framework Core SQL 查询 → 传递参数 文档:

使用SQL查询时要密切注意参数化

将任何用户提供的值引入 SQL 查询时,必须小心避免 SQL 注入攻击。当程序将用户提供的字符串值集成到 SQL 查询中,并且精心设计用户提供的值以终止该字符串并执行另一个恶意 SQL 操作时,就会发生 SQL 注入。要了解有关 SQL 注入的更多信息,请参阅此页面

FromSqlFromSqlInterpolated 方法可以安全地防止 SQL 注入,并且始终将参数数据集成为单独的 SQL 参数。但是,如果使用不当,FromSqlRaw 方法可能容易受到 SQL 注入攻击。请参阅下文了解更多详情。


0
投票
快速答案是使用

FormattableStringFactory.Create()。一个例子:

public async Task<List<YourEntity>> FromSqlExample(DateTime minDate) { var query = new StringBuilder("SELECT Id"); query.Append($" FROM YourTable WHERE CreateDate > '{minDate.ToString("yyyy-MM-dd HH:mm:ss.fff")}'"); var fs = FormattableStringFactory.Create(query.ToString()); var entities = await _context.YourDbSet.FromSql(fs).ToListAsync(); return entities; }
    
© www.soinside.com 2019 - 2024. All rights reserved.