将字符串转换为可格式化的字符串在Entity Framework中。

5

我正在尝试使用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注入攻击,因为Entity Framework将执行准备好的SQL查询并将电子邮件和密码转换为SQL查询参数:

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

有没有一种方法可以将 String 转换为 FormattableString

谢谢您的帮助。


既然您只需要进行演示,我建议使用直接的SQL连接。https://dev59.com/u2Ei5IYBdhLWcg3wDoaV 您可以直接操作字符串并在其中放置恶意查询。我认为EF在防止SQL注入方面做得很好。 - Aaron
2个回答

6

使用 System.Runtime.CompilerServices;

...

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

1
你所看到的是 Entity Framework 默认情况下很好地防止 SQL 注入攻击。但如果使用 FromSqlRaw 方法,你可以教会 SQL 注入攻击者如何构造恶意字符串。请参考 Entity Framework Core 的 SQL Queries → Passing parameters 文档。
在使用SQL查询时,应注意参数化。当将任何用户提供的值引入SQL查询时,必须小心以避免SQL注入攻击。SQL注入是指程序将用户提供的字符串值集成到SQL查询中,并且用户提供的值被设计为终止该字符串并执行另一个恶意SQL操作。要了解更多关于SQL注入的信息,请参见此页面FromSqlFromSqlInterpolated方法对SQL注入是安全的,并始终将参数数据作为单独的SQL参数集成。但是,如果不正确使用,FromSqlRaw方法可能会容易受到SQL注入攻击。有关详细信息,请参见下文。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接