使用Cosmos DB时,将CreateDocumentQuery与谓词SQL Injection一起使用是否安全?

时间:2019-07-17 12:10:59

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

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

2 个答案:

答案 0 :(得分:2)

这确实是安全的。

SDK使用内部LINQ至CosmosDB SQL转换器,该转换器仅将LINQ转换为单个字符串的查询。该SDK将使用SqlSelectClauseSqlWhereClause等内部类来收缩安全的最终结果。

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

答案 1 :(得分:0)

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

它不会评估。