FromSqlRaw注入EF Core 3.0
FromSqlRaw injection EF Core 3.0
我想知道 fromSqlRaw 方法的安全性如何。我在我的代码中执行以下操作,其中人员 ID 是方法本身的参数:
string sql = String.Format("SELECT * FROM [users].[user] WHERE Id LIKE {0}", id)
var list = this.context.Person.FromSqlRaw<Person>(sql).ToList();
这段代码对 SQL 注入安全吗?使用它时还有其他安全漏洞我应该知道吗?
对您的输入使用适当的参数化。
经过评论说明,你的参数好像是user-input字符串,这为注入攻击敞开了大门。
通常,您可以创建一个SqlCommand
,并在其中提供一些SqlParameter
。
在 EFCore 中,FromSqlRaw
和 FromSqlInterpolated
(在 3.0 中,替换 EFCore < 3.0 中的 FromSql
)允许您缩短此语法,请参阅 documentation。
string sql = "SELECT * FROM [users].[user] WHERE Id LIKE {0}"
var list = this.context.Person.FromSqlRaw<Person>(sql, "42")
请注意,这看起来与您在问题中所做的非常相似...但是文档中明确强调了不同之处:
Warning
Always use parameterization for raw SQL queries
When introducing any user-provided values into a raw SQL query, care
must be taken to avoid SQL injection attacks. In addition to
validating that such values don't contain invalid characters, always
use parameterization which sends the values separate from the SQL
text.
In particular, never pass a concatenated or interpolated string ($"")
with non-validated user-provided values into FromSqlRaw or
ExecuteSqlRaw. The FromSqlInterpolated and ExecuteSqlInterpolated
methods allow using string interpolation syntax in a way that protects
against SQL injection attacks.
确实,在您的情况下,字符串首先被插入为字符串(没有任何 sanity-check),然后执行 as-is.
FromSqlRaw
不知道“Id”部分来自参数。
我想知道 fromSqlRaw 方法的安全性如何。我在我的代码中执行以下操作,其中人员 ID 是方法本身的参数:
string sql = String.Format("SELECT * FROM [users].[user] WHERE Id LIKE {0}", id)
var list = this.context.Person.FromSqlRaw<Person>(sql).ToList();
这段代码对 SQL 注入安全吗?使用它时还有其他安全漏洞我应该知道吗?
对您的输入使用适当的参数化。
经过评论说明,你的参数好像是user-input字符串,这为注入攻击敞开了大门。
通常,您可以创建一个SqlCommand
,并在其中提供一些SqlParameter
。
在 EFCore 中,FromSqlRaw
和 FromSqlInterpolated
(在 3.0 中,替换 EFCore < 3.0 中的 FromSql
)允许您缩短此语法,请参阅 documentation。
string sql = "SELECT * FROM [users].[user] WHERE Id LIKE {0}"
var list = this.context.Person.FromSqlRaw<Person>(sql, "42")
请注意,这看起来与您在问题中所做的非常相似...但是文档中明确强调了不同之处:
Warning
Always use parameterization for raw SQL queries
When introducing any user-provided values into a raw SQL query, care must be taken to avoid SQL injection attacks. In addition to validating that such values don't contain invalid characters, always use parameterization which sends the values separate from the SQL text.
In particular, never pass a concatenated or interpolated string ($"") with non-validated user-provided values into FromSqlRaw or ExecuteSqlRaw. The FromSqlInterpolated and ExecuteSqlInterpolated methods allow using string interpolation syntax in a way that protects against SQL injection attacks.
确实,在您的情况下,字符串首先被插入为字符串(没有任何 sanity-check),然后执行 as-is.
FromSqlRaw
不知道“Id”部分来自参数。