在使用 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 将使用内部 类,如 SqlSelectClause
、SqlWhereClause
等来约定安全的最终结果。
您还可以查看您的 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\"))
它不会评估。
我在 .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 将使用内部 类,如 SqlSelectClause
、SqlWhereClause
等来约定安全的最终结果。
您还可以查看您的 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\"))
它不会评估。