我在.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注入安全的吗?
答案 0 :(得分:2)
这确实是安全的。
SDK使用内部LINQ至CosmosDB SQL转换器,该转换器仅将LINQ转换为单个字符串的查询。该SDK将使用SqlSelectClause
,SqlWhereClause
等内部类来收缩安全的最终结果。
您还可以使用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\\"))
它不会评估。