【问题标题】:Is using CreateDocumentQuery with predicate SQL Injection safe when using Cosmos DB?使用 Cosmos DB 时使用带有谓词 SQL 注入的 CreateDocumentQuery 是否安全?
【发布时间】:2019-07-17 12:10:59
【问题描述】:

我在 .NET 应用程序中使用 Microsoft.Azure.DocumentDB.Core 2.1.1 版库从 Cosmos DB 查询数据。

下面是我用来从 Cosmos DB 中查询数据的代码:

var query = predicate == null 
    ? docClient.CreateDocumentQuery<T>(CollectionUri, new FeedOptions {..... }).AsDocumentQuery()
    : docClient.CreateDocumentQuery<T>(CollectionUri, new FeedOptions { .....}).Where(predicate).AsDocumentQuery();

从上面的代码我的问题是,在查询中使用谓词将是 SQL 注入安全的吗?

【问题讨论】:

  • 请举例说明您的predicate 的外观
  • 谓词类似于 x=>x.id=="123" @silent

标签: c# azure azure-devops azure-cosmosdb sql-injection


【解决方案1】:

确实是安全的。

SDK 使用内部 LINQ 到 CosmosDB SQL 转换器,它只会将 LINQ 转换为单个字符串的查询。 SDK 将使用SqlSelectClauseSqlWhereClause 等内部类来约定安全的最终结果。

您还可以使用 query.ToString() 查看 LINQ 创建的确切查询。

【讨论】:

  • 当我执行 query.ToString() 时,我得到如下字符串---- {"query":"SELECT VALUE root FROM root WHERE ((root[\"type_name\"] = \ "TestEntity\") AND (UPPER(root[\" \"]) = \"SomeValue\")) "}
  • 当我使用 SqlQuerySpec 类尝试相同的查询时,我得到 ---- {"query":"SELECT * FROM TestEntity b WHERE (b.TestId = @id)","parameters": [{"TestId":"@id","value":"SomeValue"}]} 。在这里,查询是由我作为字符串编写的,在使用 query.tostring() 查看后,我得到了上面的字符串。
  • 两者是等价的吗? @尼克
  • @PradeepGaba 如您所见,这是两个根本不同的查询。他们正在查询不同的东西。就 SQL 注入而言,它们同样安全。
【解决方案2】:

这取决于: 如果您正在编写自己的 SQL 命令,那么您是不安全的。 使用 lambda 表达式构建查询是 SQL 注入证明。

var id = "5 AND (UPPER(root[\" \"]) = \"SomeValue\")"; query.Where(x => x.Id == id).AsDocumentQuery() 这样的查询将生成以下查询:

SELECT VALUE root FROM root WHERE ((root[\"id\"] = \"5\" AND (UPPER(root[\\" \\"]) = \\"SomeValue\\")) 

它不会评估。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 2015-04-25
    • 2011-10-19
    • 2020-12-08
    • 1970-01-01
    • 2022-08-11
    相关资源
    最近更新 更多