【问题标题】:FromSqlRaw injection EF Core 3.0FromSqlRaw 注入 EF Core 3.0
【发布时间】:2020-11-23 07:59:50
【问题描述】:

我想知道 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 注入安全吗?使用它时我应该知道其他安全漏洞吗?

【问题讨论】:

  • 使用“SqlParameter”保护您。不要使用任何其他假设。您的代码将被您或其他人更改,漏洞现在可能不存在,但这不是“偷懒”和不使用 SqlParameter 的原因。 (与编写经过清理的版本相比,您可能花费了更多时间来编写此问题并监控答案!)
  • 但是我的做法不是和SqlParameter基本一样吗?
  • 请注意,准确的问题无法回答,恕我直言。您没有显示“Id”的类型(尽管我认为它是string,因为LIKE),即使它是您的函数的参数,也没有任何迹象表明它最终不会出现外部数据。
  • 一点也不。据我所知,这里没有消毒代码。即使我们可能会向您指出一些具体的问题,然后如果您修复了这个特定的弱点,通过自己重新发明轮子、反复试验来确保安全并不是一个好习惯,尤其是在您拥有易于使用和体验的情况下- 证明方法供您使用。
  • 假设参数 id 是一个字符串。这种方法会容易受到攻击吗?

标签: sql entity-framework entity-framework-core sql-injection


【解决方案1】:

为您的输入使用适当的参数化。

经过cmets的澄清,您的参数似乎是用户输入的字符串,这是为注入攻击打开的大门。

通常你可以创建一个SqlCommand,并在里面提供一些SqlParameter

在 EFCore 中,FromSqlRawFromSqlInterpolated(在 3.0 中,替换 EFCore FromSql)允许您缩短此语法,请参阅 documentation

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

请注意,这看起来与您在问题中所做的非常相似......但文档中明确强调了不同之处:

警告

始终对原始 SQL 查询使用参数化

在将任何用户提供的值引入原始 SQL 查询时,请注意 必须注意避免 SQL 注入攻击。此外 始终验证此类值不包含无效字符 使用与 SQL 分开发送值的参数化 文本。

特别是,永远不要传递连接或插值的字符串 ($"") 将未经验证的用户提供的值放入 FromSqlRaw 或 执行SqlRaw。 FromSqlInterpolated 和 ExecuteSqlInterpolated 方法允许以保护的方式使用字符串插值语法 防止 SQL 注入攻击。

确实,在您的情况下,字符串首先被插入为字符串(没有任何完整性检查),然后按原样执行。

FromSqlRaw 不知道“Id”部分来自参数。

【讨论】:

  • 感谢您的精彩回答!我现在正在使用这种方法,它安全吗? paste.ubuntu.com/p/wtBVq2Zgm3
  • 更新了代码的功能:paste.ubuntu.com/p/hSD9wPTfHD
  • 非常感谢您的全面回答!现在我明白了。
  • 不幸的是,您似乎无法将 schema 设置为参数。 (见stackoverflow.com/questions/9094370/…)。正如那里的回答所说:您至少可以将字符限制为需要的字符。此外,您还可以获取所有现有架构名称,并检查您的变量是否包含现有的。
  • *如果需要,您应该验证自己的架构、表名和列名。目前,使用string query = "SELECT * FROM [schema].[" + variableName + "] WHERE isPublic=1";,这是字符串连接。注入攻击需要更复杂一些,但举个例子,假设variableNameusers] --。现在我可以得到你数据库的所有用户,没有任何限制,任何 WHERE 子句都会被注释掉。更糟糕的是,想象variableNameusers]; DROP TABLE [schema].[users]; --
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 2022-01-14
  • 2021-04-07
  • 2021-10-13
  • 1970-01-01
  • 2020-03-29
  • 2021-01-30
相关资源
最近更新 更多