C# 使用Cosmos DB时,将CreateDocumentQuery与谓词SQL注入一起使用是否安全?

C# 使用Cosmos DB时,将CreateDocumentQuery与谓词SQL注入一起使用是否安全?,c#,azure,azure-devops,azure-cosmosdb,sql-injection,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.Creat

我正在使用.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到CosmosDB的SQL转换器,该转换器只将LINQ转换为单个字符串的查询。SDK将使用内部类,如SqlSelectClause、SqlWhereClause等来约定安全的最终结果

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

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

有这样的疑问 变量id=5,上根[\\]=\SomeValue\; query.Wherex=>x.Id==Id.AsDocumentQuery将生成以下查询:

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

它不会计算。

请给出一个例子,说明你的谓词看起来像什么。当我进行查询时,predicate会像x=>x.id==123@silent。ToString我得到了如下字符串-{query:从根中选择值根,其中根[\type\u name\]=\TestEntity\和上根[\\]=\SomeValue\}当我使用SqlQuerySpec类尝试相同的查询时,我得到了-{query:SELECT*fromtestentityb,其中b.TestId=@id,参数:[{TestId:@id,value:SomeValue}]}。这里的查询是由我以字符串的形式编写的,在使用query.tostring查看之后,我得到了上面的字符串。两者是否等效@Nick@PradeepGaba如您所见,这是两个根本不同的查询。他们在查询不同的东西。就SQL注入而言,它们都是同等安全的。