在使用 Cosmos DB 时,使用带有谓词 SQL 的 CreateDocumentQuery 注入安全吗?

Is using CreateDocumentQuery with predicate SQL Injection safe when using Cosmos DB?

我在 .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 注入安全吗?

确实会很安全。

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

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

这取决于: 如果您正在编写自己的 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\")) 

它不会评估。