我想知道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注入安全吗?还有其他安全漏洞,我应该知道当使用这个?
我想知道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注入安全吗?还有其他安全漏洞,我应该知道当使用这个?
1条答案
按热度按时间xxb16uws1#
对输入使用适当的参数化。
在注解中澄清之后,似乎您的参数是用户输入字符串,这是一个为注入攻击敞开的大门。
通常,您可以创建
SqlCommand
,并提供一些SqlParameter
在里面。在efcore中,
FromSqlRaw
以及FromSqlInterpolated
(在3.0中,替换为FromSql
在efcore<3.0)中,允许您缩短此语法,请参阅文档。请注意,这看起来与您在问题中所做的非常相似。。。但文件中明确强调了这一区别:
警告
对原始sql查询始终使用参数化
在将任何用户提供的值引入原始sql查询时,必须小心避免sql注入攻击。除了验证这些值是否不包含无效字符外,始终使用参数化将值与sql文本分开发送。
特别是,千万不要将带有未经验证的用户提供值的串联或内插字符串($“”)传递到fromsqlraw或executesqlraw中。fromsqlinterpolated和executesqlinterpolated方法允许以防止sql注入攻击的方式使用字符串插值语法。
实际上,在您的例子中,字符串首先作为字符串插入(没有任何健全性检查),然后按原样执行。
FromSqlRaw
不知道“id”部分来自一个参数。