fromsqlraw注入ef core 3.0

yvgpqqbh  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(1120)

我想知道fromsqlraw方法有多安全。我在代码中执行以下操作,其中person id是方法本身的一个参数:

string sql = String.Format("SELECT * FROM [users].[user] WHERE Id LIKE {0}", id)

var list = this.context.Person.FromSqlRaw<Person>(sql).ToList();

这段代码对sql注入安全吗?还有其他安全漏洞,我应该知道当使用这个?

xxb16uws

xxb16uws1#

对输入使用适当的参数化。
在注解中澄清之后,似乎您的参数是用户输入字符串,这是一个为注入攻击敞开的大门。
通常,您可以创建 SqlCommand ,并提供一些 SqlParameter 在里面。
在efcore中, FromSqlRaw 以及 FromSqlInterpolated (在3.0中,替换为 FromSql 在efcore<3.0)中,允许您缩短此语法,请参阅文档。

string sql = "SELECT * FROM [users].[user] WHERE Id LIKE {0}"
var list = this.context.Person.FromSqlRaw<Person>(sql, "42")

请注意,这看起来与您在问题中所做的非常相似。。。但文件中明确强调了这一区别:
警告
对原始sql查询始终使用参数化
在将任何用户提供的值引入原始sql查询时,必须小心避免sql注入攻击。除了验证这些值是否不包含无效字符外,始终使用参数化将值与sql文本分开发送。
特别是,千万不要将带有未经验证的用户提供值的串联或内插字符串($“”)传递到fromsqlraw或executesqlraw中。fromsqlinterpolated和executesqlinterpolated方法允许以防止sql注入攻击的方式使用字符串插值语法。
实际上,在您的例子中,字符串首先作为字符串插入(没有任何健全性检查),然后按原样执行。 FromSqlRaw 不知道“id”部分来自一个参数。

相关问题